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

R语言如何按分组选取每个组内的首个非NA值

解决方案

你现有的代码仅新增了存储分组首个非NA值的列,没有执行过滤操作,可通过以下dplyr实现方案得到目标结果:

方案1:直接提取目标行(推荐)

分组后通过slice()直接取每组第一个Score非NA的行,代码更简洁:

library(dplyr)

mydata <- mydata %>%
  group_by(Id, VISIT) %>%
  slice(which(!is.na(Score))[1]) %>%
  ungroup()

代码逻辑说明:

  • which(!is.na(Score)) 会返回当前分组内Score列不为NA的所有行的相对位置
  • 取第一个位置[1]后传入slice(),即可提取对应行,自动过滤同组其他多余行

方案2:保留中间标记列的实现

如果需要保留原始所有行先做标记再过滤,可采用如下写法:

library(dplyr)

mydata <- mydata %>%
  group_by(Id, VISIT) %>%
  mutate(first_non_na = first(Score[!is.na(Score)]),
         is_target = Score == first_non_na & !is.na(Score)) %>%
  filter(is_target, .by = c(Id, VISIT)) %>%
  slice(1) %>% # 避免同组有多个相同值的非NA行时返回多条结果
  ungroup() %>%
  select(-c(first_non_na, is_target))

两种方案运行后得到的输出均符合你的预期:

# A tibble: 5 × 3
     Id VISIT    Score
  <dbl> <chr>    <dbl>
1     1 Screeing     1
2     1 Baseline     2
3     1 Week 9      78
4     2 Baseline     5
5     2 Week 2       3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:15:07