我将此功能应用于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作为命令行参数传递,因为相同的代码可以应用于具有可变列数的不同列表。 感谢
答案 0 :(得分:2)
这与subset
(Why 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)