我想在多个data.tables(或data.frames)中执行相同的操作。例如,我想在所有data.tables中以相同的规则创建相同的变量。
一个简单的例子可以是(df1 = df2 = df3,这里不失一般性)
Error in (function ... unexpected '[['
我的方法是:(i)创建数据框列表(list.df),(ii)在此列表上循环尝试创建变量:
list.df
df1 <- data.frame(var1 = c(1, 2, 2, 2, 1), var2 =c(20, 10, 10, 10, 20), var3 = c(10, 8, 15, 7, 9))
df2 <- data.frame(var1 = c(1, 2, 2, 2, 1), var2 =c(20, 10, 10, 10, 20), var3 = c(10, 8, 15, 7, 9))
df3 <- data.frame(var1 = c(1, 2, 2, 2, 1), var2 =c(20, 10, 10, 10, 20), var3 = c(10, 8, 15, 7, 9))
我的(坏)暂定:
list.df<-vector('list',3)
for(j in 1:3){
name <- paste('df',j,sep='')
list.df[j] <- name
}
显然for(i in 1:3){
a<-get(paste(list.df[[i]], "$var1", sep=""))
b<-get(paste(list.df[[i]], "$var2", sep=""))
name<-paste(list.df[[i]], "$var.new", sep="")
assign(name, ifelse(a==2 & b==10, 1, 0))
}
无法按照我的方式创建这个新变量,因为我收到错误消息&#34;找不到对象&#34;。
有关如何修复我的错误代码的任何线索?我有一种感觉,r
可以帮助我,但我不知道如何。
答案 0 :(得分:1)
我们可以在使用mget
创建对象名称字符串后使用paste
,这样我们就可以获得值。 list
中的data.frames。我们通过创建一个二进制变量变量('varNew')遍历list
(lapply(...,
)和transform
每个数据集。我们可以在逻辑语句中使用ifelse
,或者只用+
换行以将TRUE / FALSE强制转换为1/0。
lst <- lapply(mget(paste0('df', 1:3)), transform,
varNew = +(var1==2 & var2==10))
如果我们需要更新原始对象,我们可以使用list2env
。
list2env(lst, envir = .GlobalEnv)
df1
df2