如何用R/dplyr合并两列并保留分类内字母序生成单列数据框?
使用dplyr实现城市与区域的合并排序需求
问题背景
现有如下数据框:
df <- data.frame( cities = c( rep("Atlanta", 3), rep("Seattle", 4), rep("Paris", 2) ), area = c( c("A", "C", "X"), c("B", "H", "I", "D"), c("Z", "F") ) )
需要生成一个单列数据框,满足以下要求:
- 城市整体按字母顺序排列
- 每个城市分类下先显示城市名称,再按字母顺序列出对应的
area值 - 最终合并为单列,期望输出如下:
data.frame( new_column = c( "Atlanta", "A", "C", "X", "Paris", "F", "Z", "Seattle", "B", "D", "H", "I" ) )
dplyr优雅实现方案
可以结合dplyr的分组、汇总功能,搭配tidyr的展开函数完成需求,代码如下:
library(dplyr) library(tidyr) result <- df %>% group_by(cities) %>% # 每个组内拼接城市名与排序后的area,存为列表 summarise(new_column = list(c(first(cities), sort(area)))) %>% # 按城市字母顺序排序分组 arrange(cities) %>% # 展开列表为单列行数据 unnest(new_column) %>% # 转换为基础数据框(可选) as.data.frame() print(result)
步骤说明
group_by(cities):按城市名称分组,确保后续操作以城市为单位summarise(...):对每个城市组,先取城市名称(first(cities)避免重复取值),再将area按字母排序后拼接,用list()将每组内容打包为列表元素arrange(cities):将所有城市组按字母顺序重新排列unnest(new_column):把列表格式的列展开为单独的行,形成最终的单列结构as.data.frame():如果需要将结果转为基础数据框格式,执行此步骤(默认unnest后为tibble格式,也可直接使用)
运行上述代码后,即可得到符合要求的输出结果。
内容的提问来源于stack exchange,提问作者Revan
相关产品推荐
相关产品推荐

