繁体   English   中英

在 R dplyr 中按组将多列转换为相对频率

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM