首页 > 解决方案 > 将 R 中的多个列与所有可能的组合值组合在一起

问题描述

试图获得多个列值的可能组合并将它们聚合。下面是数据集

data <- data.table(A   = c("X", "Z", "X"),
                   AB   = c("W", "W", "Y"),
                   ABC = c("A", "B", "B"),
                   Total S   = c(200,300,50),
                   Total B = c(512, 600, 300))

我想在前三列中获得 A、AB 和 ABC 列中所有值的组合,然后在接下来的两列中作为 Total S 和 Total B/Total S 的聚合。

下面是所需的输出。

在此处输入图像描述

任何线索都将受到高度赞赏。

标签: rdata.table

解决方案


这是使用的选项CJ

ans <- data[CJ(A=c("", A), AB=c("", AB), ABC=c("", ABC), unique=TRUE), on=.(A, AB, ABC), 
    by=.EACHI, .(
        TotalS={x <- nafill(TotalS, "const", 0)}, 
        TotalB_S=x + nafill(TotalB, "const", 0))]
ans[-ans[, .I[rowSums(.SD=="")>=2L], .SDcols=A:ABC]]

输出:

    A AB ABC TotalS TotalB_S
 1:    W   A      0        0
 2:    W   B      0        0
 3:    Y   A      0        0
 4:    Y   B      0        0
 5: X      A      0        0
 6: X      B      0        0
 7: X  W          0        0
 8: X  W   A    200      712
 9: X  W   B      0        0
10: X  Y          0        0
11: X  Y   A      0        0
12: X  Y   B     50      350
13: Z      A      0        0
14: Z      B      0        0
15: Z  W          0        0
16: Z  W   A      0        0
17: Z  W   B    300      900
18: Z  Y          0        0
19: Z  Y   A      0        0
20: Z  Y   B      0        0

另一种更简洁的方法,减少列名的输入:

cols <- c("A","AB","ABC")
combi <- data[, do.call(CJ, lapply(.SD, function(x) unique(c("",x)))), 
    .SDcols=cols]
ans <- data[combi[rowSums(combi!="")>=2L], on=.NATURAL, 
    c(mget(cols), .(
        TotalS={x <- nafill(TotalS, "const", 0)}, 
        TotalB_S=x + nafill(TotalB, "const", 0)))]

推荐阅读