1

在 dataframedf和 column a,我想替换所有行的 allis.na和 all a=2 <- 0

这已经通过以下方式简单地实现:df[is.na(df$a) | df$a==2, "a"] <- 0

b我将在不同的列( 、、、等)上一遍又一遍地这样做cd所以我只是想看看我是否可以构建一个函数。我将简单地一遍又一遍地使用该功能。这样,如果我需要更改哪些值或哪些输出,这将是一项简单的任务。

这是一个小例子。首先是数据框:

df<-data.frame(
  a=sample(c(0,1,2), 10, replace=TRUE)
  )

现在一些缺失值:

df[sample(nrow(df), 3, FALSE), "a"] <- NA

最后,替换的动作[我已经提到过]:

df[is.na(df$a) | df$a==2, "a"] <- 0

我尝试了以下功能:

f.na<-function(df,col) df[is.na(df[,col]) | df[,col]==2, col]<-0
f.na(df, "a")

我觉得它应该工作,但我不知道为什么它不工作。我得到:

[.data.frame(df, , col)中的错误:选择了未定义的列

我知道我不能使用这个标志,所以我在网上阅读了一些内容后$尝试使用这种格式。[]我使用了apply一种函数,但后来我无法在数据框中使用结果。所以我采取了这种方式。我想我可以为需要修改的每一列反复迭代,但我认为函数解决方案会很好。

你能建议我应该尝试什么吗?

4

2 回答 2

3

我无法重现您的错误。但是,您的函数调用不会产生预期的效果,因为对函数df内部的修改f.na没有全局范围。相反,一种解决方案是让您的函数返回修改后的对象,如下所示:

set.seed(37337)
df<-data.frame(
  a=sample(c(0,1,2), 10, replace=TRUE)
)
df[sample(nrow(df), 3, FALSE), "a"] <- NA
f.na<-function(df,col) {
  df[is.na(df[,col]) | df[,col]==2, col] <- 0
  return(df)
}
(df.new <- f.na(df, "a"))
df[is.na(df$a) | df$a==2, "a"] <- 0
print(df)
于 2012-07-13T15:21:23.503 回答
1

要通过存储在另一个变量中的名称访问数据框中的列(或列表的元素),您需要使用双括号[[]]而不是单括号。

但是,对于您正在做的事情,您可能想查看宏,请参阅本期 Rnews中有关宏的文章以及包中的defmacro函数gtools

于 2012-07-13T15:33:30.510 回答