![](/img/trans.png)
[英]Apply a function across groups and columns in data.table and/or dplyr
[英]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.