2

我有几个数据框df1, df, 2...., df10。列(变量)在所有这些中都是相同的。

我想在每个变量中创建一个新变量。我可以轻松地“手动”完成,如下所示:

df1$newvariable <- ifelse(df1$oldvariable == 999, NA, df1$oldvariable)

或者,或者,

df1 = transform(df1, df1$newvariable= ifelse(df1$oldvariable==999, NA, df1$oldvariable)))

不幸的是,我无法循环执行此操作。如果我写

for (i in names) { #names is the list of dataframes
  i$newvariable <- ifelse(i$oldvariable == 999, NA, i$oldvariable)
}

我得到以下输出

Error in i$oldvariable : $ operator is invalid for atomic vectors
4

2 回答 2

3

我要做的是将所有data.frame内容集中到一个列表中,然后lapply按如下方式使用:

df1 <- as.data.frame(matrix(runif(2*10), ncol=2))
df2 <- as.data.frame(matrix(runif(2*10), ncol=2))
df3 <- as.data.frame(matrix(runif(2*10), ncol=2))
df4 <- as.data.frame(matrix(runif(2*10), ncol=2))

# create a list and use lapply
df.list <- list(df1, df2, df3, df4)
out <- lapply(df.list, function(x) {
    x$id <- 1:nrow(x)
    x
})

现在,您将拥有所有附加了新列的 data.frames,id并且outdata.frames. x[[1]]您可以使用等访问每个 data.frames x[[2]]...

于 2013-01-14T10:10:17.793 回答
1

这已经被问过很多次了。不能将该$<-“i”索引转换为第一个或第二个参数。对于[[<-第二个参数,它能够这样做,但不是第一个参数。您应该学习使用lapply,您可能需要使用两个嵌套lapply的 's,一个用于“名称”列表,另一个用于数据框中的每一列。这个问题是不完整的,因为它缺乏具体的例子。组成一组三个数据框,将一些值设置为“999”并提供名称列表。

于 2013-01-14T10:27:53.690 回答