我正在尝试将包含“#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视为向量,但是替换函数在某种程度上以不同的方式处理它,但我不确定问题是什么?
答案 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。
您应该尝试使用NA
和NULL
代替您当前使用的字符值。否则,您将无法利用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
值,因为它的长度为零。了解NA
和NULL
之间的区别非常重要,因此我建议您阅读?NA
和?NULL
。