gpt4 book ai didi

当列是因子时,R data.table 将 "NULL"替换为 `NA`

转载 作者:行者123 更新时间:2023-12-04 04:51:26 26 4
gpt4 key购买 nike

我通过 ODBC 从 SQL 数据库中提取了一些数据,列自动设置为 factor .它类似于以下内容:

library(RODBC)
library(data.table)
data <- data.table(sqlQuery(channel, query))

我的数据看起来像这样,只是有更多的列:
data <- data.table("C1"=as.factor(c(letters[1:4], "NULL", letters[5])),
"C2"=as.factor(c(rnorm(3), "NULL", rnorm(2))),
"C3"=as.factor(c(letters[1], "NULL", letters[2:4], "NULL")))
> data
C1 C2 C3
1: a -0.190200079604691 a
2: b 0.310548914832963 NULL
3: c 0.0153099116493453 b
4: d NULL c
5: NULL 0.157187027626419 d
6: e 0.118537540781528 NULL
> str(data)
Classes ‘data.table’ and 'data.frame': 6 obs. of 3 variables:
$ C1: Factor w/ 6 levels "a","b","c","d",..: 1 2 3 4 6 5
$ C2: Factor w/ 6 levels "-0.190200079604691",..: 1 5 2 6 4 3
$ C3: Factor w/ 5 levels "a","b","c","d",..: 1 5 2 3 4 5
- attr(*, ".internal.selfref")=<externalptr>

如何用 NA 替换“NULL” ?这里我要 R将这些 SQL "NULL"字符串视为缺失值 NA .我尝试了以下,但似乎 NA导致问题。
for (col in names(data)) {
set(data, which(data[[col]]=="NULL"), col, NA)
}

> Error in set(data, which(data[[col]] == "NULL"), col, NA) :
Can't assign to column 'C1' (type 'factor') a value of type 'logical' (not character, factor, integer or numeric)

RODBC 解决方案

感谢@user20650 的建议,您可以控制来自 sqlQuery 的缺失值通过做 data <- data.table(sqlQuery(channel, query, na.strings=c("NA", "NULL"))) .但是,如果您的数据源格式不正确,仍然可能出现此问题,因此这不是帖子的通用解决方案。

最佳答案

这具有所需的效果并且更加紧凑:

is.na(data) <- data == "NULL"
注意:评论 Q: is.na功能与 is.na<- 完全不同功能。这里使用的后一个是将 NA 的值分配给由赋值运算符的 hte RHS 上的逻辑表达式定义的项。有一个 is.na.data.frame -方法但不是 is.na[<-.dataframe -方法。所以不确定这是否是一个纯粹的引用策略,因为它不是用 [.data.frame 实现的。句法。它可能使用“is.na<-.default”。
我认为在稍微讨论一下“is.na<-.default”(这只是 {x[value] <- NA; x} )之后,最终会将此调用发送到 [<-.data.table所以它可能会“通过引用”完成。

关于当列是因子时,R data.table 将 "NULL"替换为 `NA`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30810681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com