【问题标题】:Is there a way to subset data by keeping the first observation of one condition and the previous observation prior to the onset of a condition?有没有办法通过保持对一个条件的第一次观察和在条件发生之前的前一次观察来对数据进行子集化?
【发布时间】:2020-09-17 12:40:26
【问题描述】:

我有一个数据集,其中包含每个人的多个观察结果,并且每年进行一次观察。有 2 个条件(真或假)。有些人对每个条件有多个观察结果,而另一些人只对一个条件有多个观察结果:

ID = c(1,1,1,2,2,3,3,3,4,4,4,5,5,5,5)
Cond = c(FALSE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE)
date = as.Date(c("2017-05-02", "2018-07-04", "2019-06-18","2011-05-05", "2012-08-09", "2015-06-13", "2016-02-08", "2017-07-22", "2014-05-03", "2015-09-05", "2016-04-07", "2016-03-06", "2017-07-23", "2018-09-28", "2019-05-29"))
df = data.frame(ID, Cond, date)

然后看起来像这样:

   ID  Cond       date
1   1 FALSE 2017-05-02
2   1  TRUE 2018-07-04
3   1  TRUE 2019-06-18
4   2 FALSE 2011-05-05
5   2 FALSE 2012-08-09
6   3 FALSE 2015-06-13
7   3 FALSE 2016-02-08
8   3  TRUE 2017-07-22
9   4 FALSE 2014-05-03
10  4 FALSE 2015-09-05
11  4 FALSE 2016-04-07
12  5 FALSE 2016-03-06
13  5 FALSE 2017-07-23
14  5  TRUE 2018-09-28
15  5  TRUE 2019-05-29

我想对数据进行子集化,以便每个人都有一行用于条件为 FALSE 的最后一次观察,而第二行用于条件为 TRUE 的第一个观察,不包括仅对一个条件进行观察的所有个人。上面的例子看起来像:

  ID  Cond       date
1  1 FALSE 2017-05-02
2  1  TRUE 2018-07-04
3  3 FALSE 2016-02-08
4  3  TRUE 2017-07-22
5  5 FALSE 2017-07-23
6  5  TRUE 2018-09-28

我只是不确定如何处理大型数据集。

【问题讨论】:

  • 从我有限的曝光来看,我猜这是关于 R 语言的,我相应地编辑了标签。那是对的吗?以后请至少用您询问的语言标记您的问题。

标签: r subset


【解决方案1】:

我怀疑可能有更好的方法,但这是使用dplyr 的一种方法。首先,group_by 每个ID,然后使用slice 获取最后一个Cond,即FALSE,使用tail,第一个Cond,即TRUE,使用head。最后,只包含给定ID 有两行的结果。

library(dplyr)

df %>%
  arrange(ID, date) %>%
  group_by(ID) %>%
  slice(c(tail(which(!Cond), 1), head(which(Cond), 1))) %>%
  filter(n() == 2)

输出

     ID Cond  date      
  <dbl> <lgl> <date>    
1     1 FALSE 2017-05-02
2     1 TRUE  2018-07-04
3     3 FALSE 2016-02-08
4     3 TRUE  2017-07-22
5     5 FALSE 2017-07-23
6     5 TRUE  2018-09-28

【讨论】:

  • 谢谢 - 我编辑了 arrange 以提醒日期应该是有序的。
  • 嗨 RLave,我的数据已经这样排列了。我可能应该在问题中提到这一点。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 2019-10-01
  • 2012-11-26
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多