我有几个数据框 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
答案 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,而out
是data.frames
的列表。您可以使用x[[1]]
,x[[2]]
等...
答案 1 :(得分:1)
这已被多次询问过。 $<-
无法将“i”索引转换为第一个或第二个参数。 [[<-
能够为第二个参数而不是第一个参数执行此操作。您应该学习使用lapply
,您可能需要使用两个嵌套的lapply
,一个用于“名称”列表,另一个用于数据框中的每个列。问题是不完整的,因为它没有具体的例子。组成一组三个数据帧,将一些值设置为“999”并提供名称列表。