首页 > 解决方案 > R删除重复并聚合多列中的总和

问题描述

我正在使用 R 并尝试删除已经计算两列出现次数的重复项。我正在使用的实际数据非常大,所以我试图避免使用循环。

table <- data.table(set = c('a', 'b', 'a', 'd', 'b', 'd', 'd', 'c'), pred = c('p', 'p', 'p', 'q', 'q', 'q', 'q', 'q'), setcount = 1:8, predcount = 9:2)

   set pred setcount predcount
1:   a    p        1         9
2:   b    p        2         8
3:   a    p        3         7
4:   d    q        4         6
5:   b    q        5         5
6:   d    q        6         4
7:   d    q        7         3
8:   c    q        8         2

我要开始的是:其中“set”和“pred”必须都相同才能算作重复 - 例如第 1 行和第 3 行,以及第 4、6 和 7 行。当我删除这些行时,我想总结已删除行的计数以实现此目的:

   set pred setcount predcount
1:   a    p        4        16
2:   b    p        2         8
3:   b    q        5         5
4:   c    q        8         2
5:   d    q       17        13

由于我在编码方面不是很有经验,所以到目前为止我所做的如下:

remove.Duplicates <- function(input, x, y, z, zz) {
            table <- input
            table <- arrange(table, x, y)
            table <- table[duplicated(table$x)&duplicated(table$y)|
                               duplicated(table$x, fromLast = T)&duplicated(table$y, fromLast = T),]
            table <- table[duplicated(table$y)|duplicated(table$y, fromLast = T),]
            table <- aggregate(z ~ .,table, sum)

            input <- input[input[, .I[!(duplicated(x)|duplicated(x, fromLast = T))], y]$V1]
            rbind(input, table)
        }

当我只有“setcount”(z)列时,这工作得很好,但我也很难聚合“predcount”(zz)列。zz 变量不在代码中,因为我无法让它在没有任何错误的情况下运行。当前代码有效,但仅适用于 3 列子集。

我确信有一种更有效的方法可以做到这一点,但我现在不知所措。我很感激任何帮助!

标签: rduplicates

解决方案


我认为您只需要汇总数据:

table[, lapply(.SD, sum, na.rm=TRUE), by=list(set,pred)]

推荐阅读