假设我有以下数据。表:
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
返回list
,cbind
,它们使用do.call
并应用rowMeans
DT[, meanYZ := rowMeans(do.call(cbind, mget(colN)), na.rm = TRUE)]
cbind(y, z)
的工作原理是y
和z
未加引号,而colN
中的元素是字符串"y"
和"z"
。当它在数据集的环境上搜索时,需要将其转换为sym
bol或name
(as.name
(和eval
uated,或者使用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