我想使用data.table
包R
来计算另一组列的许多列的列方式.我知道如何为几列做这个,我在下面提供一个例子.但是,在我的非玩具示例中,我有几十个变量我想这样做,我想找到一种方法从列名称的向量中执行此操作.这可能吗?
library(data.table)
# creates data table
dfo <- data.frame(bananas = 1:5,
melonas = 6:10,
yeah = 11:15,
its = c(1,1,1,2,2)
)
dto <- data.table(dfo)
# gets column means by 'its' column
dto[,
.('bananas_mean' = mean(bananas),
'melonas_mean' = mean(melonas),
'yeah_mean' = mean(yeah)
),
by = .(its)]
Run Code Online (Sandbox Code Playgroud)
Uwe*_*Uwe 12
OP已经请求从列名称的向量计算许多列的列均值.此外,OP在他的示例代码中已经证明他想要重命名结果列.
本评论中建议的例外答案和解决方案都不能完全满足所有这些要求.接受的答案计算data.table的所有列的均值,并且不重命名结果.注释中的解决方案确实使用列名称向量并重命名结果,但修改原始data.table,而OP期望新对象.
使用以下代码可以满足OP的要求:
# define columns to compute mean of
cols <- c("bananas", "melonas")
# compute means for selected columns and rename the output
result <- dto[, lapply(.SD, mean), .SDcols = cols, by = its
][, setnames(.SD, cols, paste(cols, "mean", sep = "_"))]
result
# its bananas_mean melonas_mean
#1: 1 2.0 7.0
#2: 2 4.5 9.5
Run Code Online (Sandbox Code Playgroud)
仅为列名称的字符向量给出的列计算平均值,输出列已重命名,并且
dto
未更改.
编辑感谢这个评论和这个答案,有一种方法可以自动data.table
重命名输出列:
result <- dto[, sapply(.SD, function(x) list(mean = mean(x))), .SDcols = cols, by = its]
result
# its bananas.mean melonas.mean
#1: 1 2.0 7.0
#2: 2 4.5 9.5
Run Code Online (Sandbox Code Playgroud)
COL*_*OLO 10
使用data.table:
library(data.table)
d <- dto[, lapply(.SD, mean), by=its]
d
its bananas melonas yeah
1: 1 2.0 7.0 12.0
2: 2 4.5 9.5 14.5
Run Code Online (Sandbox Code Playgroud)
显然,可以使用和组合其他功能.希望能帮助到你.