合并含重复类别与NA值的非数值型DataFrame
处理非数值型DataFrame的类别合并问题
问题背景
我有一个包含类别列与多列非数值型值的DataFrame,类别列每个类别重复3次,需要将每个类别合并为一行并合并对应列的值。其中category3因特殊值会引入NA,可暂时移除后手动添加,最终需保留类别列以便后续与数值型数据表合并。
原始数据
Df <- data.frame(A = c("category1", "category1", "category1", "category2", "category2", "category2", "category3", "category3", "category3"), B = c("NA", "NA", "a", "NA", "b", "NA", "NA", "NA", "a"), C = c("b", "NA", "NA", "a", "NA", "NA", "b", "NA", "NA"), D = c("NA", "ab", "NA", "NA", "NA", "ab", "NA", "NA", "NA"), E = c("NA", "NA", "NA", "NA", "NA", "NA", "NA", "c", "NA"))
此前尝试的问题
之前用以下代码处理数值型数据有效,但处理非数值型列时仅保留单个值:
data1 <- data %>% group_by(category) %>% summarize_all(list(~toString(unique(.))))
解决方案
核心思路
你的数据里的"NA"是字符串类型而非R原生的缺失值NA,所以需要先过滤掉这些字符串,再按类别分组提取有效内容合并。对于特殊的category3,先单独移除处理,之后手动添加。
代码实现
library(dplyr) # 先处理除category3外的部分 processed_data <- Df %>% filter(A != "category3") %>% group_by(A) %>% # 遍历B到E列,过滤掉"NA"字符串,取唯一值后拼接 summarize(across(B:E, ~paste(unique(.[. != "NA"]), collapse = ", "))) # 手动构造category3的行(根据实际需求调整值) category3_entry <- data.frame( A = "category3", B = "a", C = "b", D = "", E = "c" ) # 合并得到最终结果 final_data <- bind_rows(processed_data, category3_entry) # 查看结果 print(final_data)
执行结果
运行后会得到每个类别一行的DataFrame:
A B C D E 1 category1 a b ab 2 category2 b a ab 3 category3 a b c
内容的提问来源于stack exchange,提问作者noob123
相关产品推荐
相关产品推荐

