【问题标题】:Create conditional variable in multiple data.tables (or data.frames)在多个data.tables(或data.frames)中创建条件变量
【发布时间】:2016-02-28 19:10:05
【问题描述】:

我想在多个 data.tables(或 data.frames)中执行相同的操作。例如,我想在所有 data.tables 中以相同的规则为条件创建相同的变量。

一个简单的例子可以是(df1=df2=df3,这里不失一般性)

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))

我的方法是:(i) 创建数据框列表 (list.df),(ii) 在此列表上循环尝试创建变量:

list.df

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))
}

显然r 无法按照我的方式创建这个新变量,因为我收到一条错误消息“找不到对象”。 关于如何修复我的错误代码的任何线索?我有一种感觉 dplyr 可以帮助我,但我不知道如何。

【问题讨论】:

  • 暂定代码块出现一些错误。你能显示预期的输出吗
  • 是的,完全正确。出现“找不到对象”的错误,因为我的试探不起作用,@akrun。我应该写“bad tentative”。对此深表歉意。
  • 刚刚注意到。使用 $ 将无法按预期工作。另外,您是否在每个数据集中创建新变量“var.new”?
  • 我认为 $ 不起作用,但老实说,我不知道如何以另一种方式解决问题。我没有事先创建“var.new”。事实上,我曾想过这样做,但我意识到我最终使用了相同的方法(不好的尝试),所以它没有奏效。
  • 请尝试下面发布的解决方案。从显示的代码来看,我猜你需要创建一个列。

标签: r loops dplyr


【解决方案1】:

我们可以在使用paste 创建对象名称字符串后使用mget,这样我们就可以得到值,即。 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

【讨论】:

  • 我刚刚意识到 varNew 没有存储在 data.frames 中(r 显示正确的结果但不存储变量)。知道如何解决这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多