13

我正在尝试用“NULL”替换包含“#N/A”的data.frame的元素,但遇到了问题:

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8))

indices_of_NAs <- which(foo == "#N/A") 

replace(foo, indices_of_NAs, "NULL")

[<-.data.frame( , list, value = "NULL")中的错误*tmp*:新列将在现有列之后留下孔

我认为问题在于我的索引将 data.frame 视为向量,但是替换函数以某种方式对其进行了不同的处理,但我不确定问题是什么?

4

3 回答 3

19

NULL 真的意味着“什么都没有”,而不是“缺失”,所以它不能代替实际值——因为缺失的 R 使用 NA。

您可以使用 is.na 的替换方法直接更新选定的元素,这将产生合乎逻辑的结果。(使用 which 索引仅适用于 is.na,直接使用 [ 调用列表访问,这是您的错误的原因)。

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 
NAs <- foo == "#N/A"

## by replace method
is.na(foo)[NAs] <- TRUE

 ## or directly
 foo[NAs] <- NA

但是,您已经在使用 c() 创建 od 列时通过强制强制处理字符串(默认情况下实际上是一个因素),并且您可能需要单独处理列。例如,任何数字列都不会匹配字符串“#N/A”。

于 2010-05-04T17:26:16.457 回答
12

为什么不

x$col[is.na(x$col)]<-value

?
您不必更改数据框

于 2010-05-28T02:57:23.510 回答
1

replace 函数需要一个向量,而您正在提供一个 data.frame。

您真的应该尝试使用NAandNULL而不是您当前使用的字符值。否则,您将无法利用 R 的所有功能来处理缺失值。

编辑

您可以使用 apply 函数,或执行以下操作:

foo <- data.frame(day= c(1, 3, 5, 7), od = c(0.1, NA, 0.4, 0.8))
idx <- which(is.na(foo), arr.ind=TRUE)
foo[idx[1], idx[2]] <- "NULL"

在这种情况下,您无法分配实际NULL值,因为它的长度为零。NA了解and之间的区别很重要NULL,因此我建议您阅读?NAand ?NULL

于 2010-05-04T16:51:18.393 回答