在R中的几个数据帧中创建一个新变量

时间:2013-01-14 10:06:09

标签: r variables vector dataframe

我有几个数据框 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

2 个答案:

答案 0 :(得分: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
})

现在,您将拥有附加了新列id的所有data.frames,而outdata.frames的列表。您可以使用x[[1]]x[[2]]等...

访问每个data.frames

答案 1 :(得分:1)

这已被多次询问过。 $<-无法将“i”索引转换为第一个或第二个参数。 [[<-能够为第二个参数而不是第一个参数执行此操作。您应该学习使用lapply,您可能需要使用两个嵌套的lapply,一个用于“名称”列表,另一个用于数据框中的每个列。问题是不完整的,因为它没有具体的例子。组成一组三个数据帧,将一些值设置为“999”并提供名称列表。