gpt4 book ai didi

R:选择高于某个阈值的 n 个连续行中的第一个

转载 作者:行者123 更新时间:2023-12-04 10:13:38 25 4
gpt4 key购买 nike

我有一个包含 MRN、日期和测试值的数据框。

我需要选择所有 第一 每个 MRN 具有 的行三 连续值高于 0.5。

这是数据的示例版本:

   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 x 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。

任何帮助是极大的赞赏!

非常感谢!

最佳答案

最简单的方法是使用 zoo图书馆与 dplyr 一起使用.内zoo包有一个函数叫rollapply ,我们可以用它来计算一个时间窗口的函数值。

在这个例子中,我们可以应用窗口来计算接下来三个值中的最小值,然后应用指定的逻辑。

df %>% group_by(MRN) %>%
mutate(ANC=rollapply(ANC, width=3, min, align="left", fill=NA, na.rm=TRUE)) %>%
filter(ANC >= 0.5) %>%
filter(row_number() == 1)

# MRN Collected_Date ANC
# 1 001 2015-01-03 0.532
# 2 004 2014-01-03 0.500

在上面的代码中,我们使用了 rollapply计算接下来 3 项中的最小值。要了解这是如何工作的,请比较以下内容:
rollapply(1:6, width=3, min, align="left", fill=NA) # [1]  1  2  3  4 NA NA
rollapply(1:6, width=3, min, align="center", fill=NA) # [1] NA 1 2 3 4 NA
rollapply(1:6, width=3, min, align="right", fill=NA) # [1] NA NA 1 2 3 4

所以在我们的例子中,我们从左边对齐,所以它从当前位置开始并期待接下来的 2 个值。

最后,我们通过适当的值进行过滤,并对每组进行第一个观察。

关于R:选择高于某个阈值的 n 个连续行中的第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31373256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com