最小示例 - 我收到了 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))
)
将 Days_Used 视为结束日期 - 开始日期。我想以两种方式之一过滤数据框 - 按 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))
但是当我执行它时收到错误消息
Error: `condition` must be a logical vector, not a grouped_df/tbl_df/tbl/data.frame` object.
我想获得以下输出:
当
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
关于r - 使用 if_else 或 case_when 以两种不同的方式有条件地过滤数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66962249/