【问题标题】:Getting rows where there are multiple of the same value [duplicate]获取有多个相同值的行[重复]
【发布时间】:2014-12-26 23:03:03
【问题描述】:

我有一个看起来像这样的 R 数据框:

A    B          C
14   apple      45
14   bannaa     23
15   car        234
16   door       12
16   ear        325

如您所见,14 和 16 是重复的。我要:

A    B          C
14   apple      45
14   bannaa     23
16   door       12
16   ear        325

到目前为止,我有 table(DF$A) > 1,但是如何/什么是最简单的方法来做我想做的事?

【问题讨论】:

    标签: r


    【解决方案1】:

    这是另一种可能的基本 R 解决方案

    indx <- with(df, ave(A, A, FUN = length))
    df[indx > 1, ]
    #    A      B   C
    # 1 14  apple  45
    # 2 14 bannaa  23
    # 4 16   door  12
    # 5 16    ear 325
    

    或者使用data.table

    library(data.table)
    setDT(df)[, .SD[.N > 1], by = A]
    #     A      B   C
    # 1: 14  apple  45
    # 2: 14 bannaa  23
    # 3: 16   door  12
    # 4: 16    ear 325
    

    setDT(df)[, if(.N > 1) .SD, by = A]
    

    最后,一个使用rle的奖励解决方案

    ## df <- df[order(df$A), ] # If the data isn't sorted by `A`, you''ll need to sort it first
    indx <- rle(df$A)$lengths 
    df[rep(indx > 1, indx), ]
    #    A      B   C
    # 1 14  apple  45
    # 2 14 bannaa  23
    # 4 16   door  12
    # 5 16    ear 325
    

    【讨论】:

    • 嗯,.SD[.N &gt; .] 似乎很常见,不是吗?是时候优化它了。
    • @Arun,我在(另见here)给我发一封电子邮件,里面有说明:)
    【解决方案2】:
    indx <- duplicated(df[,"A"])|duplicated(df[,"A"],fromLast=TRUE)
    df[indx,]
    #   A      B   C
    #1 14  apple  45
    #2 14 bannaa  23
    #4 16   door  12
    #5 16    ear 325
    

    【讨论】:

    • fromLast 是做什么的?你可以不使用 [,1] 而只调用列名吗?
    • @SuperString fromLast 表示从反方向考虑重复。当您执行duplicated(df[,"A"]) 时,只有重复的元素才会为 TRUE,即。它不会取第一个值。通过反转,我们得到了first 和所有其他人。
    【解决方案3】:

    由于您已经开始使用不同的方法,因此您可以通过以下方式完成它:

    x <- table(df$A)
    df[df$A %in% names(x[x>1]),]
    #   A      B   C
    #1 14  apple  45
    #2 14 bannaa  23
    #4 16   door  12
    #5 16    ear 325
    

    这利用了names(x) 为您提供列A 的唯一值这一事实,您可以使用names(x[x&gt;1]) 将其子集到所有那些多次出现的值。

    如果您已经熟悉 dplyr,另一种选择是:

    require(dplyr)
    df %>% group_by(A) %>% filter(n() > 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2019-07-23
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 2018-05-21
      相关资源
      最近更新 更多