【问题标题】:How to exclude rows based on combination of values from a column in R?如何根据R中列的值组合排除行?
【发布时间】:2020-05-23 14:00:28
【问题描述】:

在我的数据框中,我有超过 260K 行。每个人 (ID) 有 4 行,每年 (2013 - 2016) 一行。我的专栏有问题。每个 ID 只允许在 2013 年有一个“0”(我已经排除了在 2013 年有一个“1”的 ID)。此外,它们只允许在 2014、2015 和 2016 年有“0”(因此 3 次“0”)或在 2014、2015 和 2016 年有“1”(因此 3 次“1”)。如果他们在 2014 年、2015 年和 2016 年混合了“0”和“1”,我想完全排除 ID。

structure(list(Year = c(2013, 2014, 2015, 2016, 2013, 2014, 2015, 
2016, 2013, 2014, 2015, 2016, 2013, 2014, 2015, 2016), Value = c(0, 
0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1), ID = c(1, 1, 1, 
1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4), Gender = c(0, 0, 0, 0, 
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1)), row.names = c(NA, -16L), class = c("tbl_df", 
"tbl", "data.frame")) 

tibble [16 x 4] (S3: tbl_df/tbl/data.frame)
 $ Year  : num [1:16] 2013 2014 2015 2016 2013 ...
 $ Value : num [1:16] 0 0 0 0 0 1 1 1 0 1 ...
 $ ID    : num [1:16] 1 1 1 1 2 2 2 2 3 3 ...
 $ Gender: num [1:16] 0 0 0 0 0 0 0 0 1 1 ...

我已经用过滤器/子集和 |/& 尝试了一些东西;但我想不通。我的数据框中还有更多列,然后显示在上面。 希望有人可以帮助我。 谢谢!

【问题讨论】:

    标签: r dataframe dplyr tidyverse


    【解决方案1】:

    您可以删除年份不是 2013 年的 Value 中同时存在 0 和 1 的组。

    library(dplyr)
    df %>% group_by(ID) %>% filter(!all(c(0, 1) %in% Value[Year != 2013]))
    
    #   Year Value    ID Gender
    #   <dbl> <dbl> <dbl>  <dbl>
    #1  2013     0     1      0
    #2  2014     0     1      0
    #3  2015     0     1      0
    #4  2016     0     1      0
    #5  2013     0     2      0
    #6  2014     1     2      0
    #7  2015     1     2      0
    #8  2016     1     2      0
    

    【讨论】:

    • 感谢罗纳克的帮助!
    【解决方案2】:

    这行得通吗?

    dat %>%
      group_by(ID) %>%
      filter(all(Year == 2013 | Value == 0) | all(Year == 2013 | Value == 1)) %>%
      ungroup()
    # # A tibble: 8 x 4
    #    Year Value    ID Gender
    #   <dbl> <dbl> <dbl>  <dbl>
    # 1  2013     0     1      0
    # 2  2014     0     1      0
    # 3  2015     0     1      0
    # 4  2016     0     1      0
    # 5  2013     0     2      0
    # 6  2014     1     2      0
    # 7  2015     1     2      0
    # 8  2016     1     2      0
    

    【讨论】:

    • 是的,终于!非常感谢!它工作得很好,也在我原来的数据框上工作。谢谢!
    【解决方案3】:

    我们可以使用data.table

    library(data.table)
    setDT(df)[, .SD[!all(c(0, 1) %in% Value[Year != 2013]], ID]
    

    【讨论】:

    • 感谢阿克伦的帮助!
    猜你喜欢
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多