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_USED为TRUE或FALSE。我尝试了以下方法:
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)
我想获得以下输出:
何时FILTER_BY_DAYS_USED:TRUE科目 A 和 B 对应的前 5 行
何时FILTER_BY_DAYS_USED:FALSE科目 B 和 C 对应的最后 7 行
我的条件过滤器的正确语法是什么?
提前谢谢了
托马斯·飞利浦
你的方向是正确的。尝试使用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)