假设您有以下数据框
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()
方法是最好的方法,或者是否还有其他方法。如果您对此有任何想法,我将不胜感激。谢谢!
一个潜在的选择:
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