【发布时间】:2014-11-18 16:34:06
【问题描述】:
假设我有以下 data.table
> DT
# A B C D E N
# 1: J t X D N 0.07898388
# 2: U z U L A 0.46906049
# 3: H a Z F S 0.50826435
# ---
# 9998: X b R L X 0.49879990
# 9999: Z r U J J 0.63233668
# 10000: C b M K U 0.47796539
现在我需要按一对列分组并计算总和 N。 如果您事先知道列名,这很容易做到:
> DT[, sum(N), by=.(A,B)]
# A B V1
# 1: J t 6.556897
# 2: U z 9.060844
# 3: H a 4.293426
# ---
# 674: V z 11.439100
# 675: M x 1.736050
# 676: U k 3.676197
但我必须在 函数 中执行此操作,该函数接收要分组的列索引向量。
> f <- function(columns = 1:2) {
DT[, sum(N), by=columns]
}
> f(1:2)
Error in `[.data.table`(DT, , sum(N), by = columns) :
The items in the 'by' or 'keyby' list are length (2). Each must be same
length as rows in x or number of rows returned by i (10000).
我也试过了:
> f(list("A", "B"))
Error in `[.data.table`(DT, , sum(N), by = list(columns)) :
column or expression 1 of 'by' or 'keyby' is type list. Do not quote column
names. Usage: DT[,sum(colC),by=list(colA,month(colB))]
我该如何让它发挥作用?
【问题讨论】:
-
在函数中添加一行,根据“columns”参数标识列名。
-
啊哈,是的
nm <- paste(names(DT)[columns], collapse = ","); DT[,sum(N), by = nm]工作 -
只需要
nm <- colnames(DT)[columns]
标签: r data.table