R - 将列名称作为变量传递给lapply

时间:2014-12-18 11:31:34

标签: r lapply

我将此功能应用于R。

中的列表
tmp<-lapply(mydata,transform, V3 = ifelse(V2 > 20, V3, NA))

列表中的每个元素都是一个包含3个数字列V1,V2和V3的数据框。上面的代码工作正常。

但是如果我尝试将列设置为变量:

colA<-paste("V",2,sep="")
colB<-paste("V",3,sep="")

然后:

tmp<-lapply(mydata,transform, colB = ifelse(colA > 20, colB, NA))

这不起作用。它创建了一个名为&#34; colB&#34;的新列。填写&#34; V3&#34;字符串。

我也尝试过get:

tmp<-lapply(mydata,transform, get(colB) = ifelse(get(colA) > 20, get(colB), NA))
Error: unexpected '=' in "tmp<-lapply(mydata,transform, get(colB) ="

有没有办法在R中传递一个带有列名的变量? 最终目标是在使用Rscript调用脚本时将colA和colB作为命令行参数传递,因为相同的代码可以应用于具有可变列数的不同列表。 感谢

1 个答案:

答案 0 :(得分:2)

这与subsetWhy is `[` better than `subset`?)的讨论类似,transform以交互方式使用。因为您的使用在这里更具编程性(您通过对象传递变量名称),所以最好离开transform并开始使用[[来访问(获取/设置)数据列:

lapply(mydata, function(x) {
   x[[colB]] <- ifelse(x[[colA]] > 20, x[[colB]], NA)
   return(x)
})

或者

lapply(mydata, function(x, c1, c2) {
   x[[c2]] <- ifelse(x[[c1]] > 20, x[[c2]], NA)
   return(x)
}, c1 = colA, c2 = colB)