0

我面临这个问题的挑战。我有这些类型的数据:

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”之间的距离(年)。

谢谢您的帮助。

4

2 回答 2

3

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

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
于 2019-12-11T19:06:37.150 回答
1

使用摘要数据框作为

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)每组(ID)中第一次出现的“1”和随后出现的“1”之间的距离(年)

gap专栏

df_summ
#    ID num_ones gap
# 1:  1        2   4
# 2:  2        2   3
# 3:  3        1  NA
于 2019-12-11T19:08:58.023 回答