在多个data.tables(或data.frames)中创建条件变量

时间:2015-11-25 20:32:56

标签: r loops dplyr

我想在多个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可以帮助我,但我不知道如何。

1 个答案:

答案 0 :(得分:1)

我们可以在使用mget创建对象名称字符串后使用paste,这样我们就可以获得值。 list中的data.frames。我们通过创建一个二进制变量变量('varNew')遍历listlapply(...,)和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