【问题标题】:In R, subset a dataframe on rows whose ID appears more than once在 R 中,对 ID 出现多次的行上的数据帧进行子集化
【发布时间】:2021-08-24 17:53:45
【问题描述】:

背景

我有一个数据框 d,其中有约 10,000 行和 n 列,其中一个是 ID 变量。大多数ID 出现一次,但有些出现不止一次。说它看起来像这样:

问题

我想要一个新的数据框d_sub,它只包含在d 中出现多次的ID。我想要一些看起来像这样的东西:

我的尝试

我尝试过这样的事情:

d_sub <- subset(d, duplicated(d$ID))

但这只会让我获得IDbd 的一个条目,并且我想要每个它们各自的行:

有什么想法吗?

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    我们可能需要将duplicated 更改为| 条件,因为duplicated 本身对于“ID”的第一次出现为FALSE

    d_sub <- subset(d, duplicated(ID)|duplicated(ID, fromLast = TRUE))
    

    【讨论】:

    • 这行得通,但我不能从 duplicated 上的文档中完全看出 为什么 它行得通。 fromLast 到底在做什么? ("duplicated(x, fromLast = TRUE) 等价于但比 rev(duplicated(rev(x))) 快" --> 对我来说是希腊语)
    • @logjammin 举个简单的例子。 v1 &lt;- c(1, 1, 2, 3); duplicated(v1); duplicated(v1, fromLast = TRUE) fromLast = TRUE 从反面复制。当您执行| 时,任何相应的 TRUE 值都会变为 TRUE,因此所有重复的元素都是 TRUE,现在
    • @logjammin 取决于函数,即rev 可能有一些额外的检查会阻止它更快。而如果您使用单个函数,即duplicated,所有这些检查都已经完成
    • 哦,我明白了,这很有趣。侧面的想法:不以任何方式抱怨,但似乎很奇怪,这需要使用OR 条件来完成——似乎R 能够更简洁地做到这一点。无论如何,非常感谢!
    • @logjammin duplicated 是一个旧函数。你是对的,它应该能够固有地拥有这个选项以避免两次调用duplicated
    【解决方案2】:

    我们可以使用add_count,然后过滤n

    library(dplyr)
    df %>%
        add_count(ID) %>% 
        filter(n!=1) %>%
        select(-n)
    

    例子:

    library(dplyr)
    df <- tribble(
        ~ID, ~gender, ~zip,
        "a", "f", 1,
        "b", "f", NA,
        "b", "m", 2,
        "c", "f", 3,
        "d", "f", NA,
        "d", "m", 4)
    
    df %>%
        add_count(ID) %>% 
        filter(n!=1) %>%
        select(-n)
    

    输出:

      ID    gender   zip
      <chr> <chr>  <dbl>
    1 b     f         NA
    2 b     m          2
    3 d     f         NA
    4 d     m          4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-16
      • 2021-02-16
      • 2015-06-20
      • 2013-07-11
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 2019-03-30
      相关资源
      最近更新 更多