如何按Id分组筛选Score非缺失值并保留Visit列有效信息?
问题描述
以下是示例数据框:
mydata <- data.frame(Id = c(01,01,02,02,02,03,03,04,04,04), Score = c(1,NA,NA,5,78,9,5,NA,3,4), Visit = c(NA, "Yes", "No", NA, NA, "Yes", NA, "Yes", NA, NA))
样本数据:
| ID | Score | Visit |
|---|---|---|
| 1 | 1 | NA |
| 1 | NA | Yes |
| 2 | NA | No |
| 2 | 5 | NA |
| 2 | 78 | NA |
| 3 | 9 | Yes |
| 3 | 5 | NA |
| 4 | NA | Yes |
| 4 | 3 | NA |
| 4 | 4 | NA |
需求:按Id分组,仅保留Score列非缺失值的行,同时将每个Id对应的Visit有效信息填充到该组所有行中,最终得到如下结果:
| ID | Score | Visit |
|---|---|---|
| 1 | 1 | Yes |
| 2 | 5 | No |
| 2 | 78 | No |
| 3 | 9 | Yes |
| 3 | 5 | Yes |
| 4 | 3 | Yes |
| 4 | 4 | Yes |
简言之,按Id分组后,将Score和Visit的非空值整合到同一行中。
解决方案
方法1:使用dplyr(tidyverse工具链)
# 安装依赖(首次使用时执行) # install.packages("dplyr") library(dplyr) result <- mydata %>% group_by(Id) %>% # 提取每组中Visit的非缺失值(假设每个Id仅一个有效Visit值) mutate(Visit = first(na.omit(Visit))) %>% # 筛选Score非缺失的行 filter(!is.na(Score)) %>% ungroup() print(result)
方法2:使用Base R
# 按Id分组填充Visit列 mydata$Visit <- ave(mydata$Visit, mydata$Id, FUN = function(x) x[!is.na(x)][1]) # 筛选Score非缺失的行 result <- mydata[!is.na(mydata$Score), ] print(result)
说明:两种方法默认每个Id对应的Visit列只有一个非缺失值,若存在多个有效Visit值,可根据需求将first替换为last或其他聚合逻辑。
内容的提问来源于stack exchange,提问作者user2845095
相关产品推荐
相关产品推荐

