在两个级别上分层分组数据,然后使用dplyr计算R中的相对频率
我想做一些看起来很简单的事情,但我对R还没有很好的感觉,它是一个由曲折的段落组成的迷宫,完全不同 我有一个包含多个变量的表,我想对两个变量进行分组。。。我想要一个两级分层分组,也称为树。这显然可以使用的功能来完成 然后我想根据级别1和级别2的组计数计算边际统计(在本例中为相对频率) 如图所示,此表共有18行: 我想要这张6行的桌子: 在dplyr中有没有一种简单的方法可以做到这一点?(我可以用SQL来做,但是…) 例如编辑的 例如,基于在两个级别上分层分组数据,然后使用dplyr计算R中的相对频率,r,dplyr,R,Dplyr,我想做一些看起来很简单的事情,但我对R还没有很好的感觉,它是一个由曲折的段落组成的迷宫,完全不同 我有一个包含多个变量的表,我想对两个变量进行分组。。。我想要一个两级分层分组,也称为树。这显然可以使用的功能来完成 然后我想根据级别1和级别2的组计数计算边际统计(在本例中为相对频率) 如图所示,此表共有18行: 我想要这张6行的桌子: 在dplyr中有没有一种简单的方法可以做到这一点?(我可以用SQL来做,但是…) 例如编辑的 例如,基于nycflights13包: library(dplyr
nycflights13
包:
library(dplyr)
install.packages("nycflights13")
require(nycflights13)
data(flights) # contains information about flights, one flight per row
ff <- flights %>%
mutate(approx_dist = floor((distance + 999)/1000)*1000) %>%
select(carrier, approx_dist) %>%
group_by(carrier, approx_dist) %>%
summarise(n = n()) %>%
arrange(carrier, approx_dist)
现在我想计算每个“载波”组中“近似距离”值的相对频率,例如,我想得到:
carrier approx_dist n rel_freq
<chr> <dbl> <int>
1 9E 1000 15740 15740/(15740+2720)
2 9E 2000 2720 2720/(15740+2720)
carrier近似距离和相对频率
1 9E 1000 15740 15740/(15740+2720)
2 9E 2000 27202720/(15740+2720)
如果我正确理解了您的问题,下面是您可以做的。这并不是为了确切地解决您的问题(我们没有数据),而是为了给您一些提示:
library(dplyr)
d <- data.frame(col1= rep(c("a", "a", "a", "b", "b", "b"),2),
col2 = rep(c("a1", "a2", "a3", "b1", "b2", "b3"),2),
stringsAsFactors = F)
d %>% group_by(col1) %>% mutate(count_g1 = n()) %>% ungroup() %>%
group_by(col1, col2) %>% summarise(rel_freq = n()/unique(count_g1)) %>% ungroup()
# # A tibble: 6 x 3
# col1 col2 rel_freq
# <chr> <chr> <dbl>
# 1 a a1 0.333
# 2 a a2 0.333
# 3 a a3 0.333
# 4 b b1 0.333
# 5 b b2 0.333
# 6 b b3 0.333
更新:在问题示例中给出的ff
表上运行此技巧,该表设置了除最后一个mutate
之外的所有内容:
ff %>% mutate(rel_freq = prop.table(n))
# A tibble: 33 x 4
# Groups: carrier [16]
carrier approx_dist n rel_freq
<chr> <dbl> <int> <dbl>
1 9E 1000 15740 0.853
2 9E 2000 2720 0.147
3 AA 1000 9146 0.279
4 AA 2000 17210 0.526
5 AA 3000 6373 0.195
6 AS 3000 714 1
7 B6 1000 24613 0.450
8 B6 2000 22159 0.406
9 B6 3000 7863 0.144
10 DL 1000 20014 0.416
# … with 23 more rows
如果我对你的问题理解正确,下面是你能做的。这并不是为了确切地解决您的问题(我们没有数据),而是为了给您一些提示:
library(dplyr)
d <- data.frame(col1= rep(c("a", "a", "a", "b", "b", "b"),2),
col2 = rep(c("a1", "a2", "a3", "b1", "b2", "b3"),2),
stringsAsFactors = F)
d %>% group_by(col1) %>% mutate(count_g1 = n()) %>% ungroup() %>%
group_by(col1, col2) %>% summarise(rel_freq = n()/unique(count_g1)) %>% ungroup()
# # A tibble: 6 x 3
# col1 col2 rel_freq
# <chr> <chr> <dbl>
# 1 a a1 0.333
# 2 a a2 0.333
# 3 a a3 0.333
# 4 b b1 0.333
# 5 b b2 0.333
# 6 b b3 0.333
更新:在问题示例中给出的ff
表上运行此技巧,该表设置了除最后一个mutate
之外的所有内容:
ff %>% mutate(rel_freq = prop.table(n))
# A tibble: 33 x 4
# Groups: carrier [16]
carrier approx_dist n rel_freq
<chr> <dbl> <int> <dbl>
1 9E 1000 15740 0.853
2 9E 2000 2720 0.147
3 AA 1000 9146 0.279
4 AA 2000 17210 0.526
5 AA 3000 6373 0.195
6 AS 3000 714 1
7 B6 1000 24613 0.450
8 B6 2000 22159 0.406
9 B6 3000 7863 0.144
10 DL 1000 20014 0.416
# … with 23 more rows
用于演示的假数据:
library(dplyr)
df <- data.frame(stringsAsFactors = F,
col1 = rep(c("A","B"), each = 9),
col2 = rep(1:3),
value = 1:18)
#> df
# col1 col2 value
#1 A 1 1
#2 A 2 2
#3 A 3 3
#4 A 1 4
#5 A 2 5
#6 A 3 6
#7 A 1 7
#8 A 2 8
#9 A 3 9
#10 B 1 10
#11 B 2 11
#12 B 3 12
#13 B 1 13
#14 B 2 14
#15 B 3 15
#16 B 1 16
#17 B 2 17
#18 B 3 18
库(dplyr)
df-df
#col1 col2值
#一一一一
#2 A 2 2
#3 A 3 3
#4 A 1 4
#5 A 2 5
#6 A 3 6
#7 A 17
#8 A 2 8
#9 A 3 9
#10b110
#11 B 2 11
#12 B 3 12
#13 B 1 13
#14 B 2 14
#15 B 3 15
#16 B 1 16
#17 B 2 17
#18 B 3 18
解决方案
df %>%
group_by(col1, col2) %>%
summarise(col2_ttl = sum(value)) %>% # Count is boring for this data, but you
mutate(share_of_col1 = col2_ttl / sum(col2_ttl)) #... could use `n()` for that
## A tibble: 6 x 4
## Groups: col1 [2]
# col1 col2 col2_ttl share_of_col1
# <chr> <int> <int> <dbl>
#1 A 1 12 0.267
#2 A 2 15 0.333
#3 A 3 18 0.4
#4 B 1 39 0.310
#5 B 2 42 0.333
#6 B 3 45 0.357
df%>%
分组依据(col1,col2)%>%
总结(col2_ttl=sum(value))%>%#计数对于这些数据来说很无聊,但是您
变异(col1的份额=col2的ttl/sum(col2的ttl))#。。。可以用'n()`来表示
##一个tibble:6x4
##分组:col1[2]
#第1列第2列第2列第1列的份额
#
#1A 1120.267
#2A 2150.333
#3A 3180.4
#4b1390.310
#5B2420.333
#6B3450.357
首先,我们按两列分组。在这种情况下,排序会有所不同,因为组是按层次创建的,并且我们运行的每个摘要都会汇总最后一层分组。因此,summary
行(或summary
,使用英国拼写,但使用美国拼写别名)对每个col1-col2组合中的值进行汇总,留下col1的剩余分组,我们可以在下一行中使用。(试着在和(值)之后加一个#
,
,看看这个阶段产生了什么。)
在最后一行中,将
col2\u ttl
除以其组中所有col2\u ttl
的总和,即每个col1
伪数据的总和,用于演示:
library(dplyr)
df <- data.frame(stringsAsFactors = F,
col1 = rep(c("A","B"), each = 9),
col2 = rep(1:3),
value = 1:18)
#> df
# col1 col2 value
#1 A 1 1
#2 A 2 2
#3 A 3 3
#4 A 1 4
#5 A 2 5
#6 A 3 6
#7 A 1 7
#8 A 2 8
#9 A 3 9
#10 B 1 10
#11 B 2 11
#12 B 3 12
#13 B 1 13
#14 B 2 14
#15 B 3 15
#16 B 1 16
#17 B 2 17
#18 B 3 18
库(dplyr)
df-df
#col1 col2值
#一一一一
#2 A 2 2
#3 A 3 3
#4 A 1 4
#5 A 2 5
#6 A 3 6
#7 A 17
#8 A 2 8
#9 A 3 9
#10b110
#11 B 2 11
#12 B 3 12
#13 B 1 13
#14 B 2 14
#15 B 3 15
#16 B 1 16
#17 B 2 17
#18 B 3 18
解决方案
df %>%
group_by(col1, col2) %>%
summarise(col2_ttl = sum(value)) %>% # Count is boring for this data, but you
mutate(share_of_col1 = col2_ttl / sum(col2_ttl)) #... could use `n()` for that
## A tibble: 6 x 4
## Groups: col1 [2]
# col1 col2 col2_ttl share_of_col1
# <chr> <int> <int> <dbl>
#1 A 1 12 0.267
#2 A 2 15 0.333
#3 A 3 18 0.4
#4 B 1 39 0.310
#5 B 2 42 0.333
#6 B 3 45 0.357
df%>%
分组依据(col1,col2)%>%
总结(col2_ttl=sum(value))%>%#计数对于这些数据来说很无聊,但是您
变异(col1的份额=col2的ttl/sum(col2的ttl))#。。。可以用'n()`来表示
##一个tibble:6x4
##分组:col1[2]
#第1列第2列第2列第1列的份额
#
#1A 1120.267
#2A 2150.333
#3A 3180.4
#4b1390.310
#5B2420.333
#6B3450.357
首先,我们按两列分组。在这种情况下,排序会有所不同,因为组是按层次创建的,并且我们运行的每个摘要都会汇总最后一层分组。因此,summary
行(或summary
,使用英国拼写,但使用美国拼写别名)对每个col1-col2组合中的值进行汇总,留下col1的剩余分组,我们可以在下一行中使用。(试着在和(值)之后加一个#
,
,看看这个阶段产生了什么。)
在最后一行中,将
col2_ttl
除以其组中所有col2_ttl
的总和,即每个col1
的总和。如果包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,则更容易帮助您。我们可以复制/粘贴到R并测试的样本数据比图片更有用。@MrFlick好的,我会这样做。这是一个非常简单的问题……如果您包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,那么就更容易帮助您。我们可以复制/粘贴到R并测试的样本数据比图片更有用。@MrFlick好的,我会这样做。不过这是一个非常简单的问题……您可以使用prop.table
:d%%>%groupby(col1,col2)%%>%summary(n=n())%%>%