R:如何替换data.frame的元素?

时间:2010-05-04 16:47:06

标签: r replace dataframe

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

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*tmp*,list,value =“NULL”)出错:   新列将在现有列

之后留下漏洞

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

3 个答案:

答案 0 :(得分:19)

NULL实际上意味着“没有”,而不是“缺失”,所以它不能取代实际值 - 因为缺少R使用NA。

您可以使用is.na的替换方法直接更新所选元素,这将使用逻辑结果。 (对索引使用哪个只适用于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”。

答案 1 :(得分:12)

为什么不

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


您不必更改数据框

答案 2 :(得分:1)

替换函数需要一个向量,并且您正在提供data.frame。

您应该尝试使用NANULL代替您当前使用的字符值。否则,您将无法利用R的所有功能来处理缺失值。

修改

您可以使用应用功能,或执行以下操作:

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值,因为它的长度为零。了解NANULL之间的区别非常重要,因此我建议您阅读?NA?NULL