筛选出 R 中指定日期范围内特定因子水平的行

问题描述 投票:0回答:1

假设您有以下数据框

df

code  date             value
<fct>  <date>           <dbl>
01    2000-01-01          23
01    2005-01-01         435 
01    2010-01-01        1000
01    2015-01-01          65
02    2000-01-01          02
02    2005-01-01       50000
02    2010-01-01        3243
02    2015-01-01        6473

假设您想要根据特定日期范围过滤掉某些因子水平中的值,同时保留其他所有内容。

例如,

if
code == "01"
when
date <= "2010-01-01" and
if
code == "02"
when
date > "2010-01-01",
then
过滤掉这些行,
else
正常返回数据。所以,结果将如下所示:

code  date             value
<fct>  <date>           <dbl>
01    2015-01-01          65
02    2000-01-01          02
02    2005-01-01       50000
02    2010-01-01        3243

我知道您可以通过按您关心的因子级别拆分数据框,然后使用

rbind()
将过滤后的数据组合在一起来实现此目的。

df_1 <-
 df |>
 filter(
 code == "01",
 date > "2010-01-01"
)

df_2 <-
 df |>
 filter(
 code == "02",
 date <= "2010-01-01"
)

df_3 <-
rbind(df_1, df_2)

但是,我想知道是否有一种更流畅的方法可以在单个

filter()
命令中执行此操作。我尝试过使用
ifelse()
if
语句和
case_when()
,但无法找到一种方法让它们考虑第二个变量(特定日期范围)。在这种情况下,在
filter()
函数中使用条件也很困难。我认为棘手的部分是,我想做的不是一个简单的“if、then、else”操作,而是一个“if、when、then、else”操作链。我不确定这是否太复杂而无法在单个
filter()
中完成,并且我展示的
rbind()
方法是最好的方法,或者是否还有其他方法。如果您对此有任何想法,我将不胜感激。谢谢!

r if-statement filter
1个回答
0
投票

一个潜在的选择:

library(tidyverse)

df <- structure(list(code = c("01", "01", "01", "01", "02", "02", "02", 
                              "02"), date = c("2000-01-01", "2005-01-01", "2010-01-01", "2015-01-01", 
                                              "2000-01-01", "2005-01-01", "2010-01-01", "2015-01-01"), value = c(23L, 
                                                                                                                 435L, 1000L, 65L, 2L, 50000L, 3243L, 6473L), data = structure(c(10957, 
                                                                                                                                                                                 12784, 14610, 16436, 10957, 12784, 14610, 16436), class = "Date")), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                                                                                         -8L))

df %>%
  filter((code == "01" & date > "2010-01-01") | (code == "02" & date <= "2010-01-01"))
#>   code       date value       data
#> 1   01 2015-01-01    65 2015-01-01
#> 2   02 2000-01-01     2 2000-01-01
#> 3   02 2005-01-01 50000 2005-01-01
#> 4   02 2010-01-01  3243 2010-01-01

创建于 2024-03-25,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.