我有一个数据集,它显示了甲方和乙方在X国的宗教信仰,以及每个国家的宗教信徒的百分比.

df <- data.frame(
  PartyA = c("Christian","Muslim","Muslim","Jewish","Sikh"),
  PartyB = c("Jewish","Muslim","Christian","Muslim","Buddhist"),
  ChristianPop = c(12,1,74,14,17),
  MuslimPop = c(71,93,5,86,13),
  JewishPop = c(9,2,12,0,4),
  SikhPop = c(0,0,1,0,10),
  BuddhistPop = c(1,0,2,0,45)
)
#      PartyA    PartyB ChristianPop MuslimPop JewishPop SikhPop BuddhistPop
# 1 Christian    Jewish           12        71         9       0           1
# 2    Muslim    Muslim            1        93         2       0           0
# 3    Muslim Christian           74         5        12       1           2
# 4    Jewish    Muslim           14        86         0       0           0
# 5      Sikh  Buddhist           17        13         4      10          45

说到这里,我想把"涉足"的宗教信徒的总数加在一起.因此,第一行的变量等于12+9,第二行的变量只有93(因为A方和B方相同,所以没有添加),依此类推.

#      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

我甚至很难找到从哪里开始,我会非常感激你的帮助.

推荐答案

我们可以用sapply迭代行,然后用paste将字符串"Pop"迭代到Party列,以进行索引和求和.

df$PartyRel <- sapply(
  1:nrow(df), 
  \(x) ifelse(df[x, 1] == df[x, 2], 
              df[x, paste0(df[x, 1], "Pop")], 
              df[x, paste0(df[x, 1], "Pop")] + df[x, paste0(df[x, 2], "Pop")])
  )

类似于我上面的基本R解决方案的 idea ,但这使用了purrr个包中的map2个整齐风格.

library(tidyverse)

df %>% 
  rowwise() %>% 
  mutate(PartyRel = map2_int(PartyA, PartyB,
                             ~ifelse(.x == .y, 
                                     get(paste0(.x, "Pop")), 
                                     get(paste0(.x, "Pop")) + get(paste0(.y, "Pop"))))) %>% 
  ungroup()

输出

以上两种情况都会产生相同的结果:

df
     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

R相关问答推荐

如何根据包含相同值的某些列获取总额

使用ggcorrplot在相关性矩阵上标注supertitle和index标签

如何在R中正确对齐放射状图中的文本

次级y轴R gggplot2

在另一个函数中调用ggplot2美学

如何改变时间图R中的悬停信息?

提取具有连续零值的行,如果它们前面有R中的有效值

在R中,如何将变量(A,B和C)拟合在同一列中,如A和B,以及A和C在同一面板中?

使用较长的查询提取具有部分匹配的列表中的较短目标,

优化从每个面的栅格中提取值

删除数据帧中特定行号之间的每第三行和第四行

如何显示准确的p值而不是<;0.001*?

R-使用stri_trans_General()将其音译为德语字母

如何更改包中函数中的参数?

如何使投篮在R中保持一致

在shiny 表格中输入的文本在第一次后未更新

是什么打破了此Quarto仪表板中的工具提示?

对一个数据帧中另一个数据帧中的值进行计数

只有当我在循环的末尾放置一条print语句时,Foreach才会给出预期的输出

用LOOCV进行K近邻问题