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

如何在R中根据另一变量的类别汇总数值?附实操案例

解决方案:新增PartyRel列计算相关宗教占比

方法1:使用tidyverse(dplyr)实现

适合习惯tidyverse语法的用户,通过逐行处理动态引用对应宗教的人口列:

library(dplyr)

df <- df %>%
  rowwise() %>%
  mutate(
    PartyRel = if_else(PartyA == PartyB,
                       # 两党宗教相同时,取对应宗教的占比
                       !!sym(paste0(PartyA, "Pop")),
                       # 不同时,相加两党对应宗教的占比
                       !!sym(paste0(PartyA, "Pop")) + !!sym(paste0(PartyB, "Pop")))
  ) %>%
  ungroup()
  • rowwise():让函数逐行处理数据
  • !!sym(paste0(..., "Pop")):将宗教名称字符串转换为对应的列名,实现动态取值

方法2:Base R原生实现

无需额外加载包,用apply逐行计算:

df$PartyRel <- apply(df, 1, function(row) {
  # 获取当前行两党的宗教
  a_rel <- row["PartyA"]
  b_rel <- row["PartyB"]
  
  # 提取对应宗教的人口占比(转为数值型)
  a_pop <- as.numeric(row[paste0(a_rel, "Pop")])
  b_pop <- as.numeric(row[paste0(b_rel, "Pop")])
  
  # 根据条件返回结果
  if (a_rel == b_rel) a_pop else a_pop + b_pop
})
  • apply(df, 1, ...):对数据框的每一行执行自定义函数
  • 手动拼接列名并提取数值,完成条件判断与计算

运行任意一种方法后,都能得到你需要的结果:

#      PartyA    PartyB ChristianPop MuslimPop JewishPop SikhPop BuddhistPop PartyRel
# 1 Christian    Jewish           12        71         9       0           1       21
# 2    Muslim    Muslim            1        93         2       0           0       93
# 3    Muslim Christian           74         5        12       1           2       79
# 4    Jewish    Muslim           14        86         0       0           0       86
# 5      Sikh  Buddhist           17        13         4      10          45       55

内容的提问来源于stack exchange,提问作者Dobbleri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:47:31