使用 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)
这是我的尝试。我无法弄清楚的主要问题:
- 包括“0”个答案的总和,
- 我不知道如何添加百分比列
- 不知道如何将这些全部合并为一个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
。
此外,我不确定您要计算的百分比是多少。
value
和name
是pivot_longer()
中names_to
和values_to
的默认值。
想知道如何使用 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)
这是我的尝试。我无法弄清楚的主要问题:
- 包括“0”个答案的总和,
- 我不知道如何添加百分比列
- 不知道如何将这些全部合并为一个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
。
此外,我不确定您要计算的百分比是多少。
value
和name
是pivot_longer()
中names_to
和values_to
的默认值。