簡體   English   中英

data.table對列組執行函數

[英]data.table execute function on groups of columns

如果我有以下數據表

m = matrix(1:12, ncol=4)
colnames(m) = c('A1','A2','B1','B2')
d = data.table(m)

是否可以在一組列上執行功能?

例如,以下將是A1,A2和B1,B2之和。

   A  B
1: 5 17
2: 7 19
3: 9 21

該解決方案最好使用500k x 100矩陣

一招將split柱成組。

然后,您可以按照Frank的建議使用rowSums (請參閱問題注釋):

# using your data example
m <- matrix(1:12, ncol = 4)
colnames(m) <- c('A1', 'A2', 'B1', 'B2')
d <- data.table(m)

# 1) group columns
groups <- split(colnames(d), substr(colnames(d), 1, 1))

# 2) group wise row sums
d[,lapply(groups, function(i) {rowSums(d[, i, with = FALSE])})]

結果

這將返回data.table

   A  B
1: 5 17
2: 7 19
3: 9 21

說明

  • split為每個組創建一個列名列表,該列名由一個(可強制執行的)因子定義。
  • substr(colnames(m), 1, 1)將第一個字母作為組ID,使用不同的方法(例如sub("([AZ]).*", "\\\\1", colnames(m))作為變量字母數)。
  • lapply通常用於在data.table多個列上應用函數。 在這里,我們創建一個列表輸出,稱為groups ,其中包含rowSums with = FALSE對於使用i的值從d獲取相應的列很重要。

絕對有可能 ...

d[, ":=" (A = A1 + A2, B = B1 + B2)]
d
   A1 A2 B1 B2 A  B
1:  1  4  7 10 5 17
2:  2  5  8 11 7 19
3:  3  6  9 12 9 21

# Want to drop the old columns?
set(d, j = which(names(d) %in% c("A1", "B1", "A2", "B2")), value = NULL)
d
   A  B
1: 5 17
2: 7 19
3: 9 21

我是否願意,是否令人滿意。 最好遵循弗蘭克的建議(請參閱評論)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM