You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:32:22