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

标签 r filter dplyr case

最小示例 - 我收到了 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_USEDTRUEFALSE。我尝试了以下方法:

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.

我想获得以下输出:

  1. FILTER_BY_DAYS_USEDTRUE时:对应主题A和B的前5行

  2. FILTER_BY_DAYS_USEDFALSE时:与主题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/

相关文章:

javascript - AngularJs $filter 在服务中使用函数

r - 在计算其他汇总统计量的同时使用 n()

r - "invalid use of pipe placeholder"与 dplyr::mutate 内的基本 R 管道

r - Shiny 应用程序不使用 dplyr 和 %in% 运算符进行过滤

r - 通过避免 R 中组中的第一个值来按组计算平均值

r - NA 子集如何工作?

r - 为什么这个 R 包无法安装以及如何修复它?

r - 使用TableGrob更改单元格的文本颜色

javascript - JQuery 排序和过滤列表

json - logstash json过滤器未解析。尽管json正确,但获取_jsonparsefailure