dplyr - 获取要汇总的 group_by 的数量
dplyr - Get number of group_by to summarize
我想通过我的 group_by 变量的长度来总结。
示例数据
set.seed(112)
df <- data.frame(
groupper = factor(sample.int(n = 12, size = 100, replace = TRUE)),
var = runif(100, min = 1, max = 25)
)
现在我有不同数量的因素:
table(df[,1])
1 2 3 4 5 6 7 8 9 10 11 12
8 7 4 8 9 7 10 7 11 3 13 13
现在我想简单地找到var
在特定时间间隔内每个groupper
的份额。
我的代码如下所示:
results <- df %>% group_by(groupper) %>% summarise(
var0_25 = sum(var < 25 / length(groupper)),
var25_50 = sum(var >= 25 & var < 50) / length(groupper))
#etc...
)
但是,究竟如何才能将正确的 group_by(groupper)
长度输入到我的 summarize
中?它因每个因素而变化。
我们可以使用n()
得到每组的元素数
library(dplyr)
df %>%
group_by(groupper) %>%
summarise(var0_25 = sum(var <25)/n(),
var25_50=sum(var >=25 & var < 50 )/n())
但是 length(.)
也可以。您的代码的问题是 var0_25
您弄乱了括号:
df %>% group_by(groupper) %>%
summarize(r = sum(var < 25) / length(groupper),
s = sum(var < 25),
l = length(groupper)) %>%
mutate(r2 = s / l)
来源:本地数据框 [12 x 5]
# groupper r s l r2
# 1 1 1 8 8 1
# 2 2 1 7 7 1
# 3 3 1 4 4 1
# 4 4 1 8 8 1
# 5 5 1 9 9 1
# 6 6 1 7 7 1
# 7 7 1 10 10 1
# 8 8 1 7 7 1
# 9 9 1 11 11 1
# 10 10 1 3 3 1
# 11 11 1 13 13 1
# 12 12 1 13 13 1
我添加了列 s
(总和),l
(长度)只是为了证明结果确实正确。
我认为当你想计算间隔时,一个通用的解决方案是使用 cut
。这段代码有点长,但只需根据您的意愿调整 cut
即可适用于任意数量的间隔。它还可以节省您手动编写列名和方程式
library(dplyr)
library(tidyr)
df %>%
mutate(indx = cut(var, c(1, 25, 50), right = FALSE)) %>%
group_by(groupper) %>%
mutate(Count = n()) %>%
group_by(groupper, indx) %>%
summarise(Res = n()/Count[1L]) %>%
spread(indx, Res)
# Source: local data frame [12 x 3]
#
# groupper [1,25) [25,50)
# 1 1 0.5000000 0.5000000
# 2 2 0.8571429 0.1428571
# 3 3 0.7500000 0.2500000
# 4 4 0.3750000 0.6250000
# 5 5 0.2222222 0.7777778
# 6 6 0.5714286 0.4285714
# 7 7 0.4000000 0.6000000
# 8 8 0.4285714 0.5714286
# 9 9 0.3636364 0.6363636
# 10 10 0.3333333 0.6666667
# 11 11 0.6153846 0.3846154
# 12 12 0.3076923 0.6923077
我想通过我的 group_by 变量的长度来总结。
示例数据
set.seed(112)
df <- data.frame(
groupper = factor(sample.int(n = 12, size = 100, replace = TRUE)),
var = runif(100, min = 1, max = 25)
)
现在我有不同数量的因素:
table(df[,1])
1 2 3 4 5 6 7 8 9 10 11 12
8 7 4 8 9 7 10 7 11 3 13 13
现在我想简单地找到var
在特定时间间隔内每个groupper
的份额。
我的代码如下所示:
results <- df %>% group_by(groupper) %>% summarise(
var0_25 = sum(var < 25 / length(groupper)),
var25_50 = sum(var >= 25 & var < 50) / length(groupper))
#etc...
)
但是,究竟如何才能将正确的 group_by(groupper)
长度输入到我的 summarize
中?它因每个因素而变化。
我们可以使用n()
得到每组的元素数
library(dplyr)
df %>%
group_by(groupper) %>%
summarise(var0_25 = sum(var <25)/n(),
var25_50=sum(var >=25 & var < 50 )/n())
但是 length(.)
也可以。您的代码的问题是 var0_25
您弄乱了括号:
df %>% group_by(groupper) %>%
summarize(r = sum(var < 25) / length(groupper),
s = sum(var < 25),
l = length(groupper)) %>%
mutate(r2 = s / l)
来源:本地数据框 [12 x 5]
# groupper r s l r2
# 1 1 1 8 8 1
# 2 2 1 7 7 1
# 3 3 1 4 4 1
# 4 4 1 8 8 1
# 5 5 1 9 9 1
# 6 6 1 7 7 1
# 7 7 1 10 10 1
# 8 8 1 7 7 1
# 9 9 1 11 11 1
# 10 10 1 3 3 1
# 11 11 1 13 13 1
# 12 12 1 13 13 1
我添加了列 s
(总和),l
(长度)只是为了证明结果确实正确。
我认为当你想计算间隔时,一个通用的解决方案是使用 cut
。这段代码有点长,但只需根据您的意愿调整 cut
即可适用于任意数量的间隔。它还可以节省您手动编写列名和方程式
library(dplyr)
library(tidyr)
df %>%
mutate(indx = cut(var, c(1, 25, 50), right = FALSE)) %>%
group_by(groupper) %>%
mutate(Count = n()) %>%
group_by(groupper, indx) %>%
summarise(Res = n()/Count[1L]) %>%
spread(indx, Res)
# Source: local data frame [12 x 3]
#
# groupper [1,25) [25,50)
# 1 1 0.5000000 0.5000000
# 2 2 0.8571429 0.1428571
# 3 3 0.7500000 0.2500000
# 4 4 0.3750000 0.6250000
# 5 5 0.2222222 0.7777778
# 6 6 0.5714286 0.4285714
# 7 7 0.4000000 0.6000000
# 8 8 0.4285714 0.5714286
# 9 9 0.3636364 0.6363636
# 10 10 0.3333333 0.6666667
# 11 11 0.6153846 0.3846154
# 12 12 0.3076923 0.6923077