如何用dplyr将DataFrame中的性别值移至新列并去重?
用dplyr处理拆分的DataFrame数据
首先构造你的示例数据方便测试:
library(dplyr) df <- tibble( name = c("Jon", "male", "sam", "male", "male"), age = c(20, NA, 21, NA, NA) )
接下来用以下代码处理,实现将性别移至新列、移除冗余行并去重重复性别:
df_cleaned <- df %>% # 为每个有效姓名-年龄行创建分组ID mutate(group_id = cumsum(!is.na(age))) %>% group_by(group_id) %>% summarise( name = first(name[!is.na(age)]), # 提取分组内的姓名 age = first(age[!is.na(age)]), # 提取分组内的年龄 # 提取分组内的性别值,仅保留第一个出现的 gender = first(name[name %in% c("male", "female")]) ) %>% ungroup() %>% select(-group_id) # 移除临时分组列
代码说明:
cumsum(!is.na(age)):通过累加非空年龄行的标识,把每个姓名行和其下方的性别行归为同一组,解决信息拆分在两行的问题。- 分组聚合时,通过
first()提取有效姓名、年龄,同时筛选出性别值并只保留第一个,自动处理多个重复性别值的情况。 - 最后移除临时的分组ID列,得到结构规整的结果。
处理后的结果:
| name | age | gender |
|---|---|---|
| Jon | 20 | male |
| sam | 21 | male |
内容的提问来源于stack exchange,提问作者Abdullah Al Sobhi
相关产品推荐
相关产品推荐

