【发布时间】:2018-08-08 16:36:25
【问题描述】:
我有这个虚拟数据集:
abc <- data.table(a = c("NA", "bc", "x"), b = c(1, 2, 3), c = c("n", "NA", "NA"))
我试图用标准 NA 替换“NA”;使用 data.table 就位。我试过了:
for(i in names(abc)) (abc[which(abc[[i]] == "NA"), i := NA])
for(i in names(abc)) (abc[which(abc[[i]] == "NA"), i := NA_character_])
for(i in names(abc)) (set(abc, which(abc[[i]] == "NA"), i, NA))
但是我仍然得到:
abc$a
"NA" "bc" "x"
我错过了什么?
编辑:我在这个问题中尝试了@frank 答案,它使用了type.convert()。 (感谢弗兰克;不知道这种晦涩难懂但有用的函数)在type.convert() 的文档中提到:“这主要是 read.table 的辅助函数。”所以我想彻底测试一下。当您有一个用“NA”(NA 字符串)填充的完整列时,此函数会产生较小的副作用。在这种情况下,type.convert() 正在将列转换为逻辑。对于这种情况,abc 将是:
abc <- data.table(a = c("NA", "bc", "x"), b = c(1, 2, 3), c = c("n", "NA", "NA"), d = c("NA", "NA", "NA"))
EDIT2:总结原始问题中的代码:
for(i in names(abc)) (set(abc, which(abc[[i]] == "NA"), i, NA))
工作正常,但仅适用于当前最新版本的 data.table (> 1.11.4)。因此,如果遇到这个问题,那么最好更新 data.table 并使用此代码而不是type.convert()
【问题讨论】:
-
我们为您提供了不同的做事方式,因为我们中的许多人都避免了循环......但是可以让您的代码工作。为我尝试
for(i in names(abc)) (abc[which(abc[[i]] == "NA"), (i) := NA]),看看是否可行。i :=说“将结果存储在“i”列中。(i) :=说“将“i”的内容评估为列名,然后将结果存储在那里”。不要忘记 RStudio 不会更新数据表的视图当您运行代码时。您必须关闭预览,然后重新打开它才能看到结果。这样做是为了提高速度。 -
仅供参考,您的
for(i in names(abc)) (set(abc, which(abc[[i]] == "NA"), i, NA))在我的计算机上工作...您只需在 RStudio 中刷新视图,因为使用:=的数据表更新不会自动刷新视图。
标签: r data.table