You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言分组过滤数据:代码修正与data.table替代方案问询

分组筛选特定行的解决方案

数据准备

首先创建示例数据框:

id <- c(1,1,1,2,2,3,3,3,3)
x1 <- c("no","yes","yes","no","no","no","no","no","yes")
x2 <- c(9,3,7,4,5,2,5,6,11)
df <- data.frame(id, x1, x2)

需求说明

  • 按id分组,每个组保留**第一个x1="yes"**的行
  • 若组内x1全部为"no",则保留该组的最后一行

原代码问题分析

原代码中if(x1 == "yes")是逐元素判断,生成的逻辑向量长度与分组内行数不匹配,导致筛选逻辑失效,无法得到正确结果。

修正后的dplyr实现

library(dplyr)

df %>%
  group_by(id) %>%
  filter(if (any(x1 == "yes")) row_number() == which(x1 == "yes")[1] else row_number() == n()) %>%
  ungroup()

运行后得到期望输出:

# A tibble: 3 × 3
     id x1       x2
  <dbl> <chr> <dbl>
1     1 yes       3
2     2 no        5
3     3 yes      11

data.table替代实现

使用data.table的实现方式如下:

library(data.table)

setDT(df)[, .SD[if (any(x1 == "yes")) which(x1 == "yes")[1] else .N], by = id]

输出结果与dplyr版本完全一致。

内容的提问来源于stack exchange,提问作者T Richard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:39:56