【问题标题】:counting occurrence between observations计数观察之间的发生
【发布时间】:2019-12-11 18:56:13
【问题描述】:

我遇到了这个问题。我有这些类型的数据:

df <- data.frame(
  ID = c(1,1,1,1,1,1,2,2,2,2,2,3,3,3,3),
  Pr = c(0, 1, 0, 999, -1, 1, 999, 1, 0, 0, 1, 0, 1, 0, 0),
  Yrs = c(2010,2011,2012,2013,2014,2015, 2010, 2011, 2012, 2013, 2014, 2012, 2013, 2014, 2015)
)


ID  Pr  Yrs
  1   0 2010
  1   1 2011
  1   0 2012
  1 999 2013
  1  -1 2014
  1   1 2015
  2 999 2010
  2   1 2011
  2   0 2012
  2   0 2013
  2   1 2014
  3   0 2012
  3   1 2013
  3   0 2014
  3   0 2015

我想得到:

a)只有一次“1”的(唯一)ID 的数量;

b)每组 (ID) 第一次出现“1”和随后出现“1”之间的距离(年)。

感谢您的帮助。

【问题讨论】:

    标签: r dplyr counting longitudinal


    【解决方案1】:

    这是解决问题的一种方法:

    library(tidyverse)
    df %>% group_by(ID) %>% filter(sum(Pr==1)==1)
    # A tibble: 4 x 3
    # Groups:   ID [1]
    #     ID    Pr   Yrs
    #  <dbl> <dbl> <dbl>
    #1     3     0  2012
    #2     3     1  2013
    #3     3     0  2014
    #4     3     0  2015
    df %>% 
       group_by(ID) %>% 
       filter(Pr==1) %>% 
       filter(n()>1) %>% 
       summarise(dist=diff(Yrs))
    # A tibble: 2 x 2
    #     ID  dist
    #  <dbl> <dbl>
    #1     1     4
    #2     2     3
    

    【讨论】:

      【解决方案2】:

      以摘要数据框为

      library(data.table)
      setDT(df)
      
      df_summ <- 
        df[, {one <- which(Pr == 1); 
              .(num_ones = length(one), gap = diff(Yrs[one[1:2]]))}
           , by = ID]
      

      我们可以看到

      a)只有一次“1”的(唯一)ID 的数量;

      df_summ[, sum(num_ones == 1)]
      # [1] 1
      

      b)第一次出现“1”和第一次出现的距离(年) 出现“1”后,每组(ID)

      gap专栏

      df_summ
      #    ID num_ones gap
      # 1:  1        2   4
      # 2:  2        2   3
      # 3:  3        1  NA
      

      【讨论】:

      • 谢谢@IceCreamToucan,这似乎正是我所需要的。我认为第一个答案应该是 df_summ[, sum(num_ones == 1)]
      猜你喜欢
      • 2014-06-25
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 2018-02-28
      相关资源
      最近更新 更多