R:如何一次过滤多个(日期-)变量进行子集化

mwg9r5ms  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(99)

我有一个包含多个日期变量的数据集,并希望创建子集,通过定义日期变量的所需日期,可以在其中过滤掉某些行。数据集中的每一行代表精神病学中的一个患者病例,并包含所有应用的隔离。因此,对于每个病例,要么没有隔离,要么记录为seclusion_date1、seclusion_date2...、seclusion_enddate1、seclusion_enddate2...。(取决于发生了多少次隔离)。我的计划是只用那些病例创建一个子集,其中没有隔离记录或seclusion_date1(首次隔离)在2019年6月30日之后以及所有可能的隔离_结束日期(1、2、3......)为2020年5月1日前,排除2019年6月30日前和2020年5月1日后发生的隔离病例。
我是R语言的新手,所以我的尝试可能是非常错误的。我感谢任何帮助或想法。
我尝试用R中的subset函数,为了一次过滤掉所有可能的隔离_enddates,我尝试使用starts_with,并尝试写一个循环。
all_seclusion_enddates <- function() { c(WMdata, any_of(c("seclusion_enddate")), starts_with("seclusion_enddate")) }错误:any_of()'必须在 selecting 函数中使用。
然后我的计划就会是cohort_2_before <- subset(WMdata, seclusion_date1 >= "2019-07-01" & all_seclusion_enddates <= "2020-04-30")
循环:for(i in 1:53) { cohort_2_before <- subset(WMdata, seclusion_date1 >= "2019-07-01" & ((paste0("seclusion_enddate", i))) <= "2020-04-30" & restraint_date1 >= "2019-07-01" & ((paste0('seclusion_enddate', i))) <= "2020-04-30") }结果:创建了0个观测值的子集。

jhdbpxl9

jhdbpxl91#

由于您没有提供可重复的示例,我无法看到您的具体问题,但我可以帮助解决核心问题。
any_ofstarts_with等是tidyverse包用来在函数中选择列的函数。它们只能在tidyverse选择器函数中用来控制它们的行为,这就是为什么你会得到那个错误。不过,它们可能是我用来解决这个问题的工具,所以你可以这样使用它们:
从默认数据集iris开始,我们使用dplyr中的filter_at函数(在R控制台中输入?filter_at以阅读帮助)。(选择特定行)从 Dataframe (指定给.tbl参数)基于条件(提供给.vars_predicate参数),它根据提供给.vars参数的选择器应用于特定列。

library(dplyr)

iris %>%
    filter_at(vars(starts_with('Sepal')), all_vars(.>4))

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.7         4.4          1.5         0.4  setosa
2          5.2         4.1          1.5         0.1  setosa
3          5.5         4.2          1.4         0.2  setosa

在本例中,我们获取 Dataframe iris,使用%>% pipe命令将其传递到filter_at,然后告诉它只查找以'Sepal'开头的列,然后告诉它选择 * 所有 * 所选列都符合给定条件的行:value > 4。如果我们想要 any column匹配条件的行,可以使用any_vars(.>4)
您可以通过将多个条件传输到其他过滤器函数中来添加多个条件:

iris %>%
    filter_at(vars(starts_with('Sepal')), all_vars(.>4)) %>%
    filter(Petal.Width > 0.3)

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.7         4.4          1.5         0.4  setosa

在这里,我们再次过滤前面的结果,以获取也包含Petal.Width > 0.3的行
在您的情况下,您需要确保日期值的格式为date(使用as.Date),然后过滤seclusion_date1vars(starts_with('secusion_enddate'))

相关问题