r - 将 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 的聚合。
下面是所需的输出。
任何线索都将受到高度赞赏。
解决方案
这是使用的选项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)))]
推荐阅读
- postgresql - 如何回顾以前的同类型记录
- python-3.x - 如何根据数据框值和字典键向数据框添加行
- c++ - pugixml 包含设置为未从 pugixml 配置 cmake 文件中找到的目录
- java - 代理背后的 UnknownHostException
- macros - 如何用宏获取类方法的参数类型?
- ios - 如何在表格视图上显示信息
- java - 如何在 Android 中以编程方式在 Spinner 上设置重叠锚点?
- reactjs - 如何从 SharePoint 列表项中获取数组中的总数
- python - 在 groupby 之后切片组并在子图中绘图
- python - 挂钩烧瓶的文件更改检测的方法?