【问题标题】:How to output duplicated rows如何输出重复的行
【发布时间】:2014-12-18 16:37:11
【问题描述】:

我有以下数据:

x1  x2  x3  x4
34  14  45  53 
2   8   18  17
34  14  45  20
19  78  21  48 
2   8   18  5

在第 1 行和第 3 行;和 2 和 5 列 X1;X2,X3 的值相等。我怎样才能只输出这 4 行,数量相等?输出应采用以下格式:

x1  x2  x3  x4
34  14  45  53
34  14  45  20
2   8   18  17
2   8   18  5

如果有不清楚的地方,请向我提问。

附加问题:在输出中

x1  x2  x3  x4
34  14  45  53
34  14  45  20
2   8   18  17
2   8   18  5

求最后一列的总和:

x1  x2  x3  x4
34  14  45  73
2   8   18  22

【问题讨论】:

  • 如果第 2 到第 4 列相等怎么办?你也想要这些还是只想要前三个?
  • 如果所有 4 列都相等是可以的。 T

标签: r duplicates unique aggregate apply


【解决方案1】:

您可以使用duplicated 执行此操作,它会在传递矩阵时检查是否存在重复行。由于您只检查前三列,您应该将dat[,-4] 传递给函数。

dat[duplicated(dat[,-4]) | duplicated(dat[,-4], fromLast=T),]
#   x1 x2 x3 x4
# 1 34 14 45 53
# 2  2  8 18 17
# 3 34 14 45 20
# 5  2  8 18  5

【讨论】:

  • 感谢您的帮助!我可以再问一个问题:我有两行或多行在所有列中具有相同的值。怎么能只保留这些行之一?
  • 请看看我的解决方案。需要向下滚动:)
  • @user45415631 您可以简单地执行dat[!duplicated(dat),] 删除任何完全重复的行。
  • @josilber 谢谢!您能解释一下为什么在 dat[,-4] 中使用“-”吗?
  • @user45415631 dat[,-4] 表示删除第四列(减号表示删除)。对于您的数据,这与说 dat[,1:3] 相同,这意味着保留第 1 到 3 列。
【解决方案2】:

使用ave的替代方法:

dat[ave(dat[,1], dat[-4], FUN=length) > 1,]

#  x1 x2 x3 x4
#1 34 14 45 53
#2  2  8 18 17
#3 34 14 45 20
#5  2  8 18  5

【讨论】:

    【解决方案3】:

    前几天学到了这个。您无需重新排序输出。

    s <- split(dat, do.call(paste, dat[-4]))
    Reduce(rbind, Filter(function(x) nrow(x) > 1, s))
    #   x1 x2 x3 x4
    # 2  2  8 18 17
    # 5  2  8 18  5
    # 1 34 14 45 53
    # 3 34 14 45 20
    

    【讨论】:

      【解决方案4】:

      还有另一种方法可以使用两个包来解决这两个问题。

      library(DescTools)
      library(dplyr)
      dat[AllDuplicated(dat[1:3]), ] %>% # this line is to find duplicates
        group_by(x1, x2) %>% # the lines followed are to sum up
        mutate(x4 = sum(x4)) %>%
        unique()
      # Source: local data frame [2 x 4]
      # Groups: x1, x2
      # 
      #   x1 x2 x3 x4
      # 1 34 14 45 73
      # 2  2  8 18 22
      

      【讨论】:

        【解决方案5】:

        也可以使用表格命令:

        > d1 = ddf[ddf$x1 %in% ddf$x1[which(table(ddf$x1)>1)],]
        > d2 = ddf[ddf$x2 %in% ddf$x2[which(table(ddf$x2)>1)],]
        > rr = rbind(d1, d2)
        > rr[!duplicated(rbind(d1, d2)),]
          x1 x2 x3 x4
        1 34 14 45 53
        3 34 14 45 20
        2  2  8 18 17
        5  2  8 18  5
        

        最后一列的总和:

        > rrt = data.table(rr2)
        > rrt[,x4:=sum(x4),by=x1]
        > rrt[rrt[,!duplicated(x1),]]
           x1 x2 x3 x4
        1: 34 14 45 73
        2:  2  8 18 22
        

        【讨论】:

          【解决方案6】:

          第一个与上面类似,让 z 成为你的 data.frame:

           library(DescTools)
           (zz <- Sort(z[AllDuplicated(z[, -4]), ], decreasing=TRUE) )
          
           # now aggregate
           aggregate(zz[, 4], zz[, -4], FUN=sum)
          
           # use Sort again, if needed...
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-01-25
            • 2020-02-27
            • 2010-11-22
            • 2021-12-07
            • 1970-01-01
            • 2014-10-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多