如何在R语言中计算宽表的行相对频率?
解决方案
首先明确:你需要的是逐行内部的相对频率计算,不需要用group_by()和summarize()——这两个函数是用来分组聚合数据(会压缩行数),而你要保留原有行结构并添加新列,应该用mutate()。
示例数据(模拟你的df2结构)
library(dplyr) df2 <- tibble( category = c("X", "Y", "Z"), no = c(20, 50, 10), yes = c(80, 50, 90) )
方法1:直接逐列计算
最直观的方式,直接基于每行的no和yes列计算比例:
df2 <- df2 %>% mutate( desired_column_no = no / (no + yes), desired_column_yes = yes / (no + yes) )
方法2:用across()批量处理(适合多列场景)
如果后续有更多类似的列对,或者想让代码更简洁,可以用across()批量生成目标列:
df2 <- df2 %>% mutate( across(c(no, yes), ~ .x / (no + yes), .names = "desired_column_{.col}") )
输出结果
执行后你会得到包含目标列的结果:
df2 #> # A tibble: 3 × 5 #> category no yes desired_column_no desired_column_yes #> <chr> <dbl> <dbl> <dbl> <dbl> #> 1 X 20 80 0.2 0.8 #> 2 Y 50 50 0.5 0.5 #> 3 Z 10 90 0.1 0.9
为什么之前的方法失败?
group_by()是用来将数据按指定列分组,summarize()会把每组数据聚合为一行,这和你需要的逐行保留原有结构并计算的需求不匹配,所以改用mutate()就能解决问题。
内容的提问来源于stack exchange,提问作者mapleleaf
相关产品推荐
相关产品推荐

