使用 if_else 或 case_when 以两种不同的方式有条件地过滤数据帧

Tho*_*ips 2 r case filter dplyr

最简单的例子 - 我收到了 3 个受试者对包含两个问题的调查问卷的 9 个回复:

set.seed(1)
df <- data.frame(ID = c(rep("A", 2), rep("B", 3), rep("C", 4)),
                 Q1 = sample(0:5, 9, replace=T),
                 Q2 = sample(1:7, 9, replace=T),
                 Days_Used = c(rep(10, 2), rep(5, 3), rep(4, 4))
)
Run Code Online (Sandbox Code Playgroud)

将 Days_Used 视为 End_Date - Start_Date。我想以两种方式之一过滤数据框 - 按 Days_Used 或填写调查问卷的次数(即按与主题关联的行数),具体取决于变量是否FILTER_BY_DAYS_USEDTRUEFALSE。我尝试了以下方法:

FILTER_BY_DAYS_USED <- TRUE
df %>% 
  group_by(ID) %>%
  if_else(FILTER_BY_DAYS_USED,
          filter(Days_Used >= 5),
          filter(n() >= 3))
Run Code Online (Sandbox Code Playgroud)

但当我执行它时收到错误消息

Error: `condition` must be a logical vector, not a grouped_df/tbl_df/tbl/data.frame` object.
Run Code Online (Sandbox Code Playgroud)

我想获得以下输出:

  1. 何时FILTER_BY_DAYS_USEDTRUE科目 A 和 B 对应的前 5 行

  2. 何时FILTER_BY_DAYS_USEDFALSE科目 B 和 C 对应的最后 7 行

我的条件过滤器的正确语法是什么?

提前谢谢了

托马斯·飞利浦

Ron*_*hah 5

你的方向是正确的。尝试使用if/else因为这是标量比较。

library(dplyr)

FILTER_BY_DAYS_USED <- TRUE

df %>% 
  group_by(ID) %>%
  filter(if(FILTER_BY_DAYS_USED) Days_Used >= 5 else n() >= 3) %>%
  ungroup

#   ID       Q1    Q2 Days_Used
#  <chr> <int> <int>     <dbl>
#1 A         0     3        10
#2 A         3     1        10
#3 B         0     5         5
#4 B         1     5         5
#5 B         4     2         5
Run Code Online (Sandbox Code Playgroud)