如何使用dplyr的group_by函数合并两个字符型列?
问题:用dplyr将字符型列合并为subgroup列并生成目标结构
给定数据框df1:
df1 <- tribble( ~Country, ~Gender, ~var1, ~var2, ~var3, ~Income, "Bangladesh", "F", 2.5, 3, 1.5, "LM", "Bangladesh", "M", 4.5, 4.3, 2.7, "LM", "Laos", "F", 2.7, 3.2, 6.5, "LM", "Laos", "M", 3.5, 5.1, 8.2, "LM", "Ghana", "F", 8.5, 5, 7.5, "LM", "Ghana", "M", 4, 6.7, 1.3, "LM", "China", "F", 4.3, 6.1, 2.5, "UM", "China", "M", 6.2, 2.8, 6.8, "UM", )
可以用group_by合并数值列:
df1 %>% group_by(Country, subgroup = var1 + var2) %>% summarise()
但尝试用+合并字符型列时触发错误:
df1 %>% group_by(Country, subgroup = Gender + Income) %>% summarise() #Error: ! non-numeric argument to binary operator
期望生成类似df2的结构:
df2 <- tribble( ~Country, ~subgroup, "Bangladesh", "F", "Bangladesh", "M", "Laos", "F", "Laos", "M", "Ghana", "F", "Ghana", "M", "China", "F", "China", "M", "Bangladesh", "LM", "Bangladesh", "LM", "Laos", "LM", "Laos", "LM", "Ghana", "LM", "Ghana", "LM", "China", "UM", "China", "UM", )
解决方案
字符型列不能用+运算,且你的目标是将Gender和Income的内容分别作为subgroup的行,需要先将数据转为长格式,再按需处理:
1. 生成目标结构df2
使用tidyr::pivot_longer将两列转为单列:
library(dplyr) library(tidyr) df_result <- df1 %>% select(Country, Gender, Income) %>% # 保留需要的列 pivot_longer( cols = c(Gender, Income), # 指定要转换的列 names_to = NULL, # 丢弃原列名 values_to = "subgroup" # 新列名 ) # 输出结果 df_result
2. 按Country和subgroup分组汇总
如果需要对分组后的数据做统计(比如计数):
df_result %>% group_by(Country, subgroup) %>% summarise(count = n(), .groups = "drop")
补充:若需拼接字符生成subgroup
如果你的需求是将Gender和Income拼接成单个字符串(如"F_LM"),用paste()实现:
df1 %>% group_by(Country, subgroup = paste(Gender, Income, sep = "_")) %>% summarise(mean_var1 = mean(var1), .groups = "drop")
内容的提问来源于stack exchange,提问作者rez
相关产品推荐
相关产品推荐

