[英]R, data.table, group by column *numbers* AND sum a column
假設我有以下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))]
我該如何工作?
這是我的處理方法:
f <- function(columns) {
Get <- if (!is.numeric(columns)) match(columns, names(DT)) else columns
columns <- names(DT)[Get]
DT[, sum(N), by = columns]
}
如果第一行( Get..
)已經是數字,則將其保留為數字;如果不是,則將其從字符轉換為數字。
用一些樣本數據進行測試:
set.seed(1)
DT <- data.table(
A = sample(letters[1:3], 20, TRUE),
B = sample(letters[1:5], 20, TRUE),
C = sample(LETTERS[1:2], 20, TRUE),
N = rnorm(20)
)
## Should work with either column number or name
f(1)
f("A")
f(c(1, 3))
f(c("A", "C"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.