R 基于无序的三列聚合数据帧
我想做与这里发布的完全相同的事情:但是有三列而不是两列R 基于无序的三列聚合数据帧,r,group-by,dplyr,data.table,R,Group By,Dplyr,Data.table,我想做与这里发布的完全相同的事情:但是有三列而不是两列 X1 X2 X3 count A B C 1 B A C 1 D N A 1 A D N 1 C B A 1 N D A 1 A D N 1 理想情况下,我希望有以下内容: X1 X2 X3
X1 X2 X3 count
A B C 1
B A C 1
D N A 1
A D N 1
C B A 1
N D A 1
A D N 1
理想情况下,我希望有以下内容:
X1 X2 X3 count
A B C 3
A D N 4
我已经尝试过修改代码,但我无法使其正常工作,也没有找到一个解决方法,无论是dplyr还是data.table
require(data.table)
DT <- data.table(DF)
DT.OUT <- DT[, list(size=sum(count)),
by=list(id1 = pmin(X1,X2,X3),id2 = c(X1,X2,X3)[!c(c(X1,X2,X3) %in% c(pmax(X1,X2,X3), pmin(X1,X2,X3)))] ,id3 = pmax(X1,X2,X3))]
require(data.table)
DT使用apply
对前三列按行排序,然后使用aggregate
获得count
aggregate(d$count, as.data.frame(t(apply(d[1:3], 1, sort))), sum)
# V1 V2 V3 x
#1 A B C 3
#2 A D N 4
或
d%>%
行()
突变(grp=toString(排序(c(X1,X2,X3)))%>%
解组()%>%
分组依据(grp)%>%
汇总(计数=总和(计数))%>%
分离(grp,分为=c(“x1”、“x2”、“x3”))
##一个tibble:2x4
#x1x2x3计数
#
#1 A B C 3
#2 A D N 4
或
f=as.character(排序(唯一(未列出(d[1:3]))
d%>%
行()
突变(grp=toString(f[f%in%c(X1,X2,X3)])%>%
解组()%>%
分组依据(grp)%>%
汇总(计数=总和(计数))%>%
分离(grp,分为=c(“x1”、“x2”、“x3”))
##一个tibble:2x4
#x1x2x3计数
#
#1 A B C 3
#2 A D N 4
这里是另一个选项:
DT[, (cols) := {
m <- as.matrix(.SD)
as.data.table(matrix(m[order(row(m), m)], nrow=.N, byrow=TRUE))
}, .SDcols=cols][,
sum(count), cols]
一个选项是使用数据熔化。表
library(data.table)
unique(melt(DT[, rn := .I], id.var = c('rn', 'count'))[,
grp := toString(sort(unique(value))), rn], by = c("rn", "grp"))[,
.(count = sum(count)), grp]
# grp count
#1: A, B, C 3
#2: A, D, N 4
或者另一个选项是在行上循环执行排序
,然后按求和进行分组
DT[, c(sort(.SD), list(count = count)), 1:nrow(DT),
.SDcols = X1:X3][, .(count = sum(count)), .(X1, X2, X3)]
# X1 X2 X3 count
#1: A B C 3
#2: A D N 4
给出:
letters N
1: ABC 3
2: ADN 4
如果需要X1、X2和X3列,则可以使用以下其中一种:
extract(l, letters, into = c("X1", "X2", "X3"), "(.)(.)(.)")
separate(l, letters, into = c("X1", "X2", "X3"), sep = 1:3)
其中,l
是包含可变字母和N的数据框。结果为:
X1 X2 X3 N
1: A B C 3
2: A D N 4
将此算法调整到3列以上很容易。我可以问一下您的数据集有多大吗?10865行和所示的相同列(X1、X2、X3、count)使用矩阵
转换的方法很好。这会对大数据集中的内存产生影响吗?@akrun问了一个有趣的问题。我还认为,由于转换为matrixExcellent,非常优雅的解决方案,会产生影响!非常感谢!
DT[, c(sort(.SD), list(count = count)), 1:nrow(DT),
.SDcols = X1:X3][, .(count = sum(count)), .(X1, X2, X3)]
# X1 X2 X3 count
#1: A B C 3
#2: A D N 4
df[, letters := pmap_chr(list(X1, X2, X3), ~c(...) %>% sort() %>% str_c(collapse = ""))]
df[, .N, by = letters]
letters N
1: ABC 3
2: ADN 4
extract(l, letters, into = c("X1", "X2", "X3"), "(.)(.)(.)")
separate(l, letters, into = c("X1", "X2", "X3"), sep = 1:3)
X1 X2 X3 N
1: A B C 3
2: A D N 4