Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在两个级别上分层分组数据,然后使用dplyr计算R中的相对频率_R_Dplyr - Fatal编程技术网

在两个级别上分层分组数据,然后使用dplyr计算R中的相对频率

在两个级别上分层分组数据,然后使用dplyr计算R中的相对频率,r,dplyr,R,Dplyr,我想做一些看起来很简单的事情,但我对R还没有很好的感觉,它是一个由曲折的段落组成的迷宫,完全不同 我有一个包含多个变量的表,我想对两个变量进行分组。。。我想要一个两级分层分组,也称为树。这显然可以使用的功能来完成 然后我想根据级别1和级别2的组计数计算边际统计(在本例中为相对频率) 如图所示,此表共有18行: 我想要这张6行的桌子: 在dplyr中有没有一种简单的方法可以做到这一点?(我可以用SQL来做,但是…) 例如编辑的 例如,基于nycflights13包: library(dplyr

我想做一些看起来很简单的事情,但我对R还没有很好的感觉,它是一个由曲折的段落组成的迷宫,完全不同

我有一个包含多个变量的表,我想对两个变量进行分组。。。我想要一个两级分层分组,也称为树。这显然可以使用的功能来完成

然后我想根据级别1和级别2的组计数计算边际统计(在本例中为相对频率)

如图所示,此表共有18行:

我想要这张6行的桌子:

在dplyr中有没有一种简单的方法可以做到这一点?(我可以用SQL来做,但是…)

例如编辑的

例如,基于
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())%%>%