dplyr:如何计算每组内不同值的频率
dplyr: How to calculate frequency of different values within each group
我可能有一个简单的失败问题,但无法弄清楚。
我的数据集有两个变量,两个因子。它看起来像这样:
my.data<-data.frame(name=c("a","a","b","b","b","b", "b", "b", "e", "e", "e"),
var1=c(1, 2, 3, 4, 2, 1, 4, 1, 3, 4, 3))
我想计算 1、2、3 和 4 之后聚合到一行中的所有 a、b 和 e 的频率。这意味着所有“a”、“b”和“e”都应该在一行中,然后我想创建 4 个变量来指示这些行中所有 1、2、3 和 4 的频率。我设法计算了“a”、“b”和“e”的所有计数的频率,但我无法将所有“a”、“b”和“e”折叠成单独的行。
我的代码是这个:
a <- my.data %>%
dplyr:: select(name, var1) %>%
mutate(name = as.factor(name),
var1 = as.factor(var1)) %>%
group_by(name, var1) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))
我的结果应该是这样的:
name Freq1 Freq2 Freq3 Freq4
a 0,00 0,00 0,5 0,5
b 0,30 0,30 0,30 0,10
e 0,20 0,20 0,20 0,40
谢谢。
您可以使用 pivot_wider
以宽格式导入数据 -
library(dplyr)
library(tidyr)
my.data %>%
count(name, var1) %>%
group_by(name) %>%
mutate(n = prop.table(n)) %>%
ungroup %>%
pivot_wider(names_from = var1, values_from = n, names_prefix = 'Freq')
# name Freq1 Freq2 Freq3 Freq4
# <chr> <dbl> <dbl> <dbl> <dbl>
#1 a 0.5 0.5 NA NA
#2 b 0.333 0.167 0.167 0.333
#3 e NA NA 0.667 0.333
library(purrr)
my.data %>%
split(.$name) %>%
{cbind(name = names(.), map_dfr(., ~pluck(.x, "var1") %>% table() %>% prop.table()))}
name 1 2 3 4
1 a 0.5000000 0.5000000 NA NA
2 b 0.3333333 0.1666667 0.1666667 0.3333333
3 e NA NA 0.6666667 0.3333333
您也可以使用基数 R
prop.table(table(my.data), 1)
回归
var1
name 1 2 3 4
a 0.5000000 0.5000000 0.0000000 0.0000000
b 0.3333333 0.1666667 0.1666667 0.3333333
e 0.0000000 0.0000000 0.6666667 0.3333333
我们也可以在这里利用包 janitor
来获得巨大优势:
library(janitor)
my.data %>%
tabyl(name, var1) %>%
adorn_percentages()
name 1 2 3 4
a 0.5000000 0.5000000 0.0000000 0.0000000
b 0.3333333 0.1666667 0.1666667 0.3333333
e 0.0000000 0.0000000 0.6666667 0.3333333
或
my.data %>%
tabyl(name, var1) %>%
adorn_percentages() %>%
adorn_totals(c('row', 'col')) %>%
adorn_pct_formatting(2)
name 1 2 3 4 Total
a 50.00% 50.00% 0.00% 0.00% 100.00%
b 33.33% 16.67% 16.67% 33.33% 100.00%
e 0.00% 0.00% 66.67% 33.33% 100.00%
Total 83.33% 66.67% 83.33% 66.67% 300.00%