【问题标题】:Find how many times duplicated rows repeat in R data frame [duplicate]查找R数据框中重复行重复的次数[重复]
【发布时间】:2013-08-14 14:18:05
【问题描述】:

我有一个类似下面例子的数据框

a = c(1, 1, 1, 2, 2, 3, 4, 4)
b = c(3.5, 3.5, 2.5, 2, 2, 1, 2.2, 7)
df <-data.frame(a,b)

我可以通过以下代码从 R 数据框中删除重复的行,但是如何找到每个重复行重复的次数?我需要将结果作为向量。

unique(df)

df[!duplicated(df), ]

【问题讨论】:

    标签: r


    【解决方案1】:

    这是使用库 plyr 中的函数 ddply() 的解决方案

    library(plyr)
    ddply(df,.(a,b),nrow)
    
      a   b V1
    1 1 2.5  1
    2 1 3.5  2
    3 2 2.0  2
    4 3 1.0  1
    5 4 2.2  1
    6 4 7.0  1
    

    【讨论】:

    • 您可以通过将 function(x) nrow(x) 替换为 nrow 来节省一些字符。
    • @orizo​​n 谢谢,更新了我的答案。
    • 是否有可能用 dplyr 重新创建它?
    • @maj 我没用过 dplyr 所以无法回答
    • 是否有与 a、b 列无关的解决方案? (即,使用所有列)
    【解决方案2】:

    你总是可以用一块石头杀死两只鸟:

    aggregate(list(numdup=rep(1,nrow(df))), df, length)
    # or even:
    aggregate(numdup ~., data=transform(df,numdup=1), length)
    # or even:
    aggregate(cbind(df[0],numdup=1), df, length)
    
      a   b numdup
    1 3 1.0      1
    2 2 2.0      2
    3 4 2.2      1
    4 1 2.5      1
    5 1 3.5      2
    6 4 7.0      1
    

    【讨论】:

    • 能否解释一下复制aggregate(list(numdup=rep(1,nrow(df))), df, length)背后的原因?
    • @dukelover - 聚合需要列的总和与分组变量的长度相同,所以我只需重复 1 即可。
    • 非常感谢您的回复。你能解释一下这个代码aggregate(numdup ~., data=transform(df,numdup=1), length) 吗? -- 这里numdup ~的意义是什么?
    【解决方案3】:

    这里有两种方法。

    # a example data set that is not sorted
    DF <-data.frame(replicate(sequence(1:3),n=2))
    
    # example using similar idea to duplicated.data.frame
    count.duplicates <- function(DF){
    x <- do.call('paste', c(DF, sep = '\r'))
      ox <- order(x)
      rl <- rle(x[ox])
      cbind(DF[ox[cumsum(rl$lengths)],,drop=FALSE],count = rl$lengths)
    
    }
    count.duplicates(DF)
    #   X1 X2 count
    # 4  1  1     3
    # 5  2  2     2
    # 6  3  3     1
    
    
    # a far simpler `data.table` approach
    library(data.table)
    count.dups <- function(DF){
    
      DT <- data.table(DF)
      DT[,.N, by = names(DT)]
    }
    count.dups(DF)
    #    X1 X2 N
    # 1:  1  1 3
    # 2:  2  2 2
    # 3:  3  3 1
    

    【讨论】:

    • 你的第一个解决方案非常棒,同时每次我想到功能它的噩梦时都会感到恐惧
    【解决方案4】:

    使用 dplyr:

    summarise(group_by(df,a,b),length(b))
    

    group_size(group_by(df,a,b))
    #[1] 1 2 2 1 1 1
    

    【讨论】:

    • 别忘了管道! df %>% group_by(a, b) %>% group_size()
    • df %&gt;% group_by_all() %&gt;% count
    猜你喜欢
    • 2018-08-10
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2016-11-03
    • 2014-11-09
    • 2016-11-02
    相关资源
    最近更新 更多