如何在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
相关产品推荐
相关产品推荐

