[英]Convert Multiple Columns to Relative Frequency by Group in R dplyr
我有一个带有一些分组变量和其他几个具有相同前缀的数字变量的 df。
have <-
data.frame(
group = c(rep('a', 10), rep('b', 10)),
x1 = sample(1:10, 20, replace = TRUE),
x2 = sample(1:10, 20, replace = TRUE),
x3 = sample(1:10, 20, replace = TRUE)
)
这些数字变量的数量和名称会发生变化,但它们总是带有x
前缀。
我需要按组将它们转换为相对频率。 我可以像这样手动执行此操作:
want <-
have %>%
group_by(group) %>%
mutate(x1_freq = x1 / sum(x1),
x2_freq = x2 / sum(x2),
x3_freq = x3 / sum(x3)) %>%
ungroup()
但是下次当这些x
变量中有 5 个、10 个或 50 个时,这并不理想……如何对所有以x
开头的变量执行此操作?
我们可以使用 cross( across()
和starts_with()
!
library(tidyverse)
my.freq = function(x){
#just calculating the frequency. I prefer to make my functions outside of chains
x / sum(x)
}
ideal <-
have %>%
group_by(group) %>%
mutate(across(.cols = starts_with("x"),
.fns = my.freq,
.names = "{.col}_freq"
)) %>%
ungroup()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.