Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于无序的三列聚合数据帧_R_Group By_Dplyr_Data.table - Fatal编程技术网

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