2010-05-04 195 views
13

我试图替换包含 “#N/A” 与 “NULL” 一个data.frame的元件,并且我运行到问题:R:如何替换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*tmp*,列表,值=“NULL”): 新列将在现有列后留下空洞

我认为问题在于我的索引将data.frame作为向量处理,但替换函数以某种方式对待它,但我不确定这个问题是什么?

回答

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 

但是,你是用绳子强迫威逼已经在处理(实际上是默认因子)在OD柱,当它与C(创建),你可能需要单独对待列。例如,任何数字列在字符串“#N/A”上都不会有匹配。

+0

从来没有意识到有一个“is.na < - ”,太酷了。 – geoffjentry 2011-07-13 20:11:51

+0

你是什么意思,“任何数字列永远不会匹配字符串”#N/A“,例如。”?我怎样才能检查我在看什么样的专栏? – spier 2011-09-10 22:49:53

+0

不错的解决方案。如何在用NA替换值后将列重新解释为数字?我有很多列,并且很难分辨哪些NA值已更改。 – Dave 2012-06-06 11:12:13

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

+0

谢谢谢恩,你建议我将我的data.frame转换为矢量,执行该功能,然后将其转换回data.frame?我将使用您建议的数据格式。 – John 2010-05-04 17:12:23

12

为什么不

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


你不必改变你的数据框