【问题标题】:R data.table remove rows conditionally among groupsR data.table 在组之间有条件地删除行
【发布时间】:2021-03-08 08:35:34
【问题描述】:

我有这个示例数据集,实际有数百万行,所以我很感激data.table 解决方案,但tidyverse 解决方案也可以:

dat1 = data.frame(name = c("X1", "X1", "X1", "X2", "X2", "X2", "X2", "X2", "X2"), 
              year = c(2015,2016,2017,2015,2016,2016,2017,2017, 2018),
              choice = c("o","o","o","o","o","r","r","o","o")
)
dat1

我需要应用的逻辑是:

如果任何名称和年份组合的唯一选项 "o" 存在,则保留带有 "o" 的行。

如果存在任何名称和年份组合选项"o""r",则使用"r" 保留行并使用"o" 删除行。我不想命名nameyear 组合。

【问题讨论】:

    标签: r data.table tidyverse data-wrangling


    【解决方案1】:
    library(data.table)
    setDT(dat1)
    dat1[, .SD[all(choice == "o") | choice == "r",], by = .(name, year)]
    #    name year choice
    # 1:   X1 2015      o
    # 2:   X1 2016      o
    # 3:   X1 2017      o
    # 4:   X2 2015      o
    # 5:   X2 2016      r
    # 6:   X2 2017      r
    # 7:   X2 2018      o
    

    (我在查看 KarthikS 的答案之前生成了这个,但逻辑和结果是相同的。)

    【讨论】:

      【解决方案2】:

      这行得通吗:

      library(dplyr)
      dat1 %>% group_by(name ,year) %>% filter(all(choice == 'o' )|choice == 'r')
      # A tibble: 7 x 3
      # Groups:   name, year [7]
        name   year choice
        <chr> <dbl> <chr> 
      1 X1     2015 o     
      2 X1     2016 o     
      3 X1     2017 o     
      4 X2     2015 o     
      5 X2     2016 r     
      6 X2     2017 r     
      7 X2     2018 o     
      

      【讨论】:

      • 感谢@Karthik 它工作正常,我刚刚接受了 r2evans 的回答,因为它是 data.table 解决方案。
      【解决方案3】:

      还可以选择将列转换为factor,并在自定义顺序中指定levels,然后在使用droplevels 删除级别后选择first levels

      library(dplyr)
      dat1 %>%
           group_by(name, year) %>%
           filter(choice %in% levels(droplevels(factor(choice, 
                 levels = c('r', 'o'))))[1])
      # A tibble: 7 x 3
      # Groups:   name, year [7]
      #  name   year choice
      #  <chr> <dbl> <chr> 
      #1 X1     2015 o     
      #2 X1     2016 o     
      #3 X1     2017 o     
      #4 X2     2015 o     
      #5 X2     2016 r     
      #6 X2     2017 r     
      #7 X2     2018 o     
      

      data.table 的等效选项是

      library(data.table)
      setDT(dat1)[dat1[, .I[choice %in% 
             levels(droplevels(factor(choice, 
                 levels = c('r', 'o'))))[1]], .(name, year)]$V1]
      

      【讨论】:

        猜你喜欢
        • 2014-05-04
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 2015-08-31
        • 2021-06-09
        • 2016-12-02
        相关资源
        最近更新 更多