Как скомбинировать таблицу частот с помощью dplyr - PullRequest
0 голосов
/ 11 января 2019

У меня есть следующий фрейм данных:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
df <- nycflights13::flights %>% 
  select(distance) %>% 
  group_by(distance) %>% 
  summarise(n = n()) %>% 
  arrange(distance) %>% ungroup() 

df
#> # A tibble: 214 x 2
#>    distance     n
#>       <dbl> <int>
#>  1       17     1
#>  2       80    49
#>  3       94   976
#>  4       96   607
#>  5      116   443
#>  6      143   439
#>  7      160   376
#>  8      169   545
#>  9      173   221
#> 10      184  5504
#> # … with 204 more rows

То, что я хочу сделать, это поместить столбец distance в ячейку размером 100, а также суммирование столбца n соответственно. Как это можно сделать?

Итак, вы получите что-то вроде:

bin_distance sum_n
1-100       1633  #(1 + 49 + 976 + 607)
101-200     21344 # (443 + ... + 5327)
#etc

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Другое решение tidyverse. Он тесно следует логике кода @Ronak Shah, но вместо cut() он использует cut_width() из ggplot2.

nycflights13::flights %>%
 select(distance) %>%
 group_by(ints = cut_width(distance, width = 100, boundary = 0)) %>%
 summarise(n = n())

   ints            n
   <fct>       <int>
 1 [0,100]      1633
 2 (100,200]   21344
 3 (200,300]   28310
 4 (300,400]    7748
 5 (400,500]   21292
 6 (500,600]   26815
 7 (600,700]    7846
 8 (700,800]   48904
 9 (800,900]    7574
10 (900,1e+03] 18205
0 голосов
/ 11 января 2019

Самый простой подход - использовать cut, создав groups, используя seq для каждых 100 значений и sum значения для каждой группы.

library(dplyr)

df %>%
  group_by(group = cut(distance, breaks = seq(0, max(distance), 100))) %>%
  summarise(n = sum(n))


#   group         n
#   <fct>       <int>
# 1 (0,100]      1633
# 2 (100,200]   21344
# 3 (200,300]   28310
# 4 (300,400]    7748
# 5 (400,500]   21292
# 6 (500,600]   26815
# 7 (600,700]    7846
# 8 (700,800]   48904
# 9 (800,900]    7574
#10 (900,1e+03] 18205
# ... with 17 more rows

, который можно перевести в базу R, используя aggregate, как

aggregate(n ~ distance, 
 transform(df, distance = cut(distance, breaks = seq(0, max(distance), 100))), sum)
...