在R中提取每个唯一ID对应的属性值并支持均值计算
解决方法
针对你的需求,这里有两种简单可靠的方法提取每个参与者的唯一属性,且能直接用于后续统计计算:
方法1:使用distinct()快速去重
distinct()是dplyr里专门提取唯一行的函数,直接指定ID和需要保留的属性列,就能自动保留每个ID对应的唯一属性值:
library(dplyr) # 提取每个ID对应的指定属性(可替换成你需要的其他属性列) unique_participants <- df %>% distinct(ID, age, birth_date, gender, .keep_all = FALSE)
- 如果你需要保留所有属性列(仅去除重复的观测行),可以把
.keep_all设为TRUE,只指定ID即可:
unique_participants <- df %>% distinct(ID, .keep_all = TRUE)
方法2:group_by() + 提取唯一值
你之前用group_by()的思路没问题,但不需要用paste()——因为每个ID的属性是唯一的,直接用first()或unique()提取单个值即可:
unique_participants <- df %>% group_by(ID) %>% summarise( age = first(age), birth_date = first(birth_date), gender = first(gender), # 继续添加你需要的其他属性列 .groups = "drop" # 取消分组,方便后续操作 )
.groups = "drop"能让结果回到普通数据框,避免后续统计时的分组干扰。
后续统计计算示例
拿到唯一属性数据框后,就能直接做均值等统计操作,比如计算不同性别的平均年龄:
gender_age_mean <- unique_participants %>% group_by(gender) %>% summarise(mean_age = mean(age, na.rm = TRUE))
你之前方法出现重复值的原因
每个ID对应多行观测,paste(age, collapse=",")会把同一ID下所有行的age(实际是同一个值)拼接成字符串,所以会出现25,25,25这类重复内容。改用first()或unique()就能直接拿到单个唯一值。
内容的提问来源于stack exchange,提问作者coco
相关产品推荐
相关产品推荐

