按列分组并根据条件生成新变量的R语言数据处理问题
问题描述
现有如下DataFrame:
| Column A | Column B |
|---|---|
| id1 | blue |
| id1 | red |
| id1 | grey |
| id2 | red |
| id3 | red |
| id3 | grey |
期望输出:
| Column A | Column B |
|---|---|
| id1 | all.mixed |
| id2 | red |
| id3 | red.grey |
尝试过以下代码:
table1 <- mydf %>% group_by(ColA, ColB) %>% count(ColB)
得到结果:
ColA ColB n <chr> <chr> <int> 1 id1 blue 1 2 id1 red 1 3 id1 grey 1 4 id2 red 1 5 id3 red 1 6 id3 grey 1
后续卡壳,尤其不知道如何处理同一Column A对应重复Column B值的情况(比如id5对应两个grey)。
解决方案
核心逻辑是先按Column A分组,提取每组唯一的Column B值,再根据唯一值的数量和内容生成目标结果:
library(dplyr) result_df <- mydf %>% # 按Column A分组 group_by(`Column A`) %>% # 提取每组唯一的Column B值,存入列表列 summarise(unique_vals = list(unique(`Column B`)), .groups = "drop") %>% # 根据唯一值的情况生成对应输出 mutate(`Column B` = case_when( # 包含三种颜色时输出all.mixed setequal(unique_vals[[1]], c("blue", "red", "grey")) ~ "all.mixed", # 只有一种唯一值时直接输出该值 length(unique_vals[[1]]) == 1 ~ unique_vals[[1]], # 其他情况(两种组合)按排序后用.连接 TRUE ~ paste(sort(unique_vals[[1]]), collapse = ".") )) %>% # 移除中间辅助列 select(-unique_vals)
测试重复值场景
如果输入包含:
| Column A | Column B |
|---|---|
| id5 | grey |
| id5 | grey |
运行代码后,id5对应的Column B会输出grey,因为unique()会自动去重,最终唯一值仅为一个。
内容的提问来源于stack exchange,提问作者user20388122
相关产品推荐
相关产品推荐

