我有一个包含MRN,日期和测试值的数据帧。R:选择某一阈值以上的n个连续行的第一行
我需要选择所有第一每具有高于0.5连续值MRN行。
这是数据的示例版本:
MRN Collected_Date ANC
1 001 2015-01-02 0.345
2 001 2015-01-03 0.532
3 001 2015-01-04 0.843
4 001 2015-01-05 0.932
5 002 2015-03-03 0.012
6 002 2015-03-05 0.022
7 002 2015-03-06 0.543
8 002 2015-03-07 0.563
9 003 2015-08-02 0.343
10 003 2015-08-03 0.500
11 003 2015-08-04 0.734
12 003 2015-08-05 0.455
13 004 2014-01-02 0.001
14 004 2014-01-03 0.500
15 004 2014-01-04 0.562
16 004 2014-01-05 0.503
示例代码:
df <- data.frame(MRN = c('001','001','001','001',
'002','002','002','002',
'003','003','003','003',
'004','004','004','004'),
Collected_Date = as.Date(c('01-02-2015','01-03-2015','01-04-2015','01-05-2015',
'03-03-2015','03-05-2015','03-06-2015','03-07-2015',
'08-02-2015','08-03-2015','08-04-2015','08-05-2015',
'01-02-2014','01-03-2014','01-04-2014','01-05-2014'),
format = '%m-%d-%Y'),
ANC = as.numeric(c('0.345','0.532','0.843','0.932',
'0.012','0.022','0.543','0.563',
'0.343','0.500','0.734','0.455',
'0.001','0.500','0.562','0.503')))
目前,我使用的是很别扭的方法使用滞后函数来计算的时间差,然后过滤所有>> = 0.5的值,然后总结这些值,这有助于选择THIRD值的日期。然后我。减去两天时间到达第一值的日期:
df %>% group_by(MRN) %>%
mutate(., days_diff = abs(Collected_Date[1] - Collected_Date)) %>%
filter(ANC >= 0.5) %>%
mutate(days = days_diff + lag((days_diff))) %>%
filter(days == 5) %>%
mutate(Collected_Date = Collected_Date - 2) %>%
select(MRN, Collected_Date)
输出:
来源:本地数据帧[2×2] 组:MRN
MRN Collected_Date
1 001 2015-01-03
2 004 2014-01-03
有一定是一种更简单/更优雅的方式。另外,如果测试日期之间存在差距,则不会给出准确的结果。
我给这例如期望的输出是:
MRN Collected_Date ANC
1 001 2015-01-03 0.532
2 004 2014-01-03 0.500
因此,如果至少三个连续的测试值> = 0.5,所述第一值的日期应被返回。
如果没有至少三个连续值> = 0.5,则应返回NA。
任何帮助,非常感谢!
非常感谢!
看看'cumany' - 这是完美的这种情况。 – hadley