【问题标题】:How to subset dataframe based on conditions between columns across rows depending on values如何根据值根据跨行列之间的条件对数据框进行子集化
【发布时间】:2021-04-14 17:39:37
【问题描述】:

我有一个数据框,其中包含有关个人 ID、期间和工作地点代码的信息。我想知道在数据集的整个时间跨度内独自工作的人是谁。

考虑下面这个非常简单的例子。个人 A 在第 1 期单独在两个工作地点 (x,y) 工作。个人 B 和 C 在第 1 期在工作地点 z 一起工作。个人 B 在第 2 期单独在工作地点 w 工作。个人 D 在第 k 地点单独工作在第 2 期。

mydf <- data.frame(id=c('A','A','B','C','B','D'),
                   period=c(1,1,1,1,2,2),
                   work_place=c('x','y','z','z','w','k'))

我想找出那些在整个期间独自工作的人的行,在这种情况下是指个人 A 和 D。

ids_alone <- data.frame(id=c('A','A','D'),
                        period=c(1,1,2),
                        work_place=c('x','y','k'))

【问题讨论】:

    标签: r subset


    【解决方案1】:

    按'period'、'work_place'分组,创建一个列'n',其中包含不同'id'的数量,然后按'id'分组,filter那些'id'具有all'n'元素为1

    library(dplyr)
    mydf %>%
      group_by(period, work_place) %>% 
      mutate(n = n_distinct(id)) %>%
      group_by(id) %>% 
      filter(all(n ==1)) %>%
      ungroup %>%
      select(-n)
    

    -输出

    # A tibble: 3 x 3
    #  id    period work_place
    #  <chr>  <dbl> <chr>     
    #1 A          1 x         
    #2 A          1 y         
    #3 D          2 k         
    

    【讨论】:

      【解决方案2】:

      data.table 选项(遵循 @akrun 的相同想法)

      setDT(mydf)[
        ,
        n := uniqueN(id),
        .(period, work_place)
      ][
        ,
        .SD[mean(n) == 1], id
      ][
        ,
        n := NULL
      ][]
      

      给了

         id period work_place
      1:  A      1          x
      2:  A      1          y
      3:  D      2          k
      

      【讨论】:

        猜你喜欢
        • 2013-08-15
        • 2022-06-18
        • 1970-01-01
        • 2015-11-27
        • 2013-03-17
        • 2020-04-15
        • 2016-09-10
        • 1970-01-01
        • 2016-10-28
        相关资源
        最近更新 更多