r-当列存储在字符向量中时,如何使用cbind()



假设我有以下数据。表:

DT <- data.table(x=rep(c(1,2),3),y=rep(1,6),z=rep(2,6))
DT
x y z
1: 1 1 2
2: 2 1 2
3: 1 1 2
4: 2 1 2
5: 1 1 2
6: 2 1 2

我正在计算y、z列上的rowMeans。如果列名在字符向量中,我可以使用cbind((吗?

colN = c('y','z')

我知道DT[,meanYZ:=rowMeans(cbind(y,z((]有效。但是有没有一种方法可以让colN发挥作用?所以,就像

DT[, meanYZ := rowMeans(cbind(colN)]

首选选项是通过.SDcols指定感兴趣的列,在.SD(Subset of Data.table(上应用rowmeans

library(data.table)
DT[, meanYZ := rowMeans(.SD, na.rm = TRUE), .SDcols = colN]

也可以使用mget返回listcbind,它们使用do.call并应用rowMeans

DT[, meanYZ := rowMeans(do.call(cbind, mget(colN)), na.rm = TRUE)]

cbind(y, z)的工作原理是yz未加引号,而colN中的元素是字符串"y""z"。当它在数据集的环境上搜索时,需要将其转换为symbol或name(as.name(和evaluated,或者使用get返回列的值

也许您可以先从DT中对colN中的列进行子集设置,然后为rowMeans生成一个新列,例如

DT[, MeanYZ := rowMeans(.SD[, colN, with = FALSE])]

使得

x y z MeanYZ
1: 1 1 2    1.5
2: 2 1 2    1.5
3: 1 1 2    1.5
4: 2 1 2    1.5
5: 1 1 2    1.5
6: 2 1 2    1.5

最新更新