【问题标题】:Select rows from grouped dataframe based on duplicate values根据重复值从分组数据框中选择行
【发布时间】:2021-02-08 20:49:20
【问题描述】:

我有一个包含 3 列的数据框。每个人的 id,他们所属的组数 (gr) 和位置代码 (loc)。我要做的是确定哪些人访问 2 个位置,顺序如下:位置 1 -> 位置 2 -> 位置 1。

虚拟数据集:

id <- c(1,1,1,1,1,1,1,2,2,2,2,2,4,4,4,4,4,4,4,4)
gr<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,4,4,4,4,4,4,4)

loc <- c(5,5,4,4,5,5,5,3,3,3,3,2,2,2,2,3,3,2,2,2)

df<- data.frame(id,gr, loc) 

我尝试使用diff 函数来识别位置之间的差异:

dif<- diff(as.numeric(df$loc))

但我找不到任何其他前进的方式。此外,这种方法不考虑每个人的组(并且组之间的 id 重复)。我在想可能使用lag 函数,但不确定它如何或是否有帮助。有什么建议吗?非常感谢,我还是 R 的新手。

期望的输出:

id<- c(1,4)
gr<- c(1,4)
out<- data.frame(cbind(id, gr))

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    一个可能的data.table 选项

    unique(
      setDT(df)[
        ,
        q := rleid(loc), .(id, gr)
      ][
        ,
        .SD[uniqueN(q) == 3 & first(loc) == last(loc)], .(id, gr)
      ][
        ,
        .(id, gr)
      ]
    )
    

    给予

       id gr
    1:  1  1
    2:  4  4
    

    【讨论】:

      【解决方案2】:

      也许这行得通

      library(dplyr)
      library(data.table)
      df %>% 
          group_by(id) %>% 
          filter(n_distinct(rleid(loc)) >2) %>%
          slice_tail(n = 1) %>%
          select(-loc) %>%
          ungroup
      # A tibble: 2 x 2
      #    id    gr
      #  <dbl> <dbl>
      #1     1     1
      #2     4     4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 2014-01-23
        • 1970-01-01
        • 2016-09-10
        • 2019-02-25
        • 2012-07-21
        相关资源
        最近更新 更多