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
相关产品推荐
相关产品推荐

