使用 R 中的循环通过计算创建聚合表

Creating aggregated tables with calculations using loops in R

想知道如何使用 R 中的不同计算结果创建 table。这是一个使用 mtcars df

的示例

# Load tidyverse
library(tidyverse)

# Select only cyl vs and am from mtcars for simplicity
mt_select <- select(mtcars, c(cyl, vs, am))


# Here is the table I wish to make using some type of looping function
# (I have like 40 variables in actual dataset)
freq_table <- mt1 %>% group_by(cyl) %>% 
  summarise(n = n(),
            vs_sum = sum(vs),
            vs_perc = sum(vs)/n*100,
            am_sum = sum(am),
            am_perc = sum(am)/n*100)
print(freq_table)

这是我的尝试。我无法弄清楚的主要问题:

  1. 包括“0”个答案的总和,
  2. 我不知道如何添加百分比列
  3. 不知道如何将这些全部合并为一个table
# make a vector to loop through
mt_vars <- names(mt_select)

# Loop to make tables
for (i in mt_vars){
  mt_select %>% 
    group_by(cyl) %>% 
    count_(i) %>%
    print()
}

几个月来我一直在想办法做这个,但总是决定我不需要 table 或其他东西。非常感谢任何帮助!!

您没有提供预期的输出,但我认为解决您的问题的关键可能是将您的数据转换为长格式。这可能会让你做你想做的事而不需要任何循环。例如,以mtcars为输入:

library(tidyverse)

mtcars %>% 
  pivot_longer(everything()) %>% 
  group_by(name) %>% 
  summarise(
    n=n(),
    valueSum=sum(value),
    valuePct=valueSum/(n*100)
  )
# A tibble: 11 × 4
   name      n valueSum valuePct
   <chr> <int>    <dbl>    <dbl>
 1 am       32      13   0.00406
 2 carb     32      90   0.0281 
 3 cyl      32     198   0.0619 
 4 disp     32    7383.  2.31   
 5 drat     32     115.  0.0360 
 6 gear     32     118   0.0369 
 7 hp       32    4694   1.47   
 8 mpg      32     643.  0.201  
 9 qsec     32     571.  0.178  
10 vs       32      14   0.00438
11 wt       32     103.  0.0322 

这是否接近您想要的?如果您只想处理一部分列,请在旋转后替换您需要的 everything()filter 或旋转前的 select

此外,我不确定您要计算的百分比是多少。

valuenamepivot_longer()names_tovalues_to的默认值。