Расчеты с dplyr на основе конкретных факторов и дат и итоговых значений - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть кадр данных подсчета различных классификаций корабля на конкретные даты на определенных расстояниях от берега (DOS), например, 0-12 нм и 0-100 нм - я хотел бы вычесть корабли в пределах 0-12 нм DOS из0-100 нм, так что я могу рассчитать, сколько, например, "пассажирских" судов было только в 12-100 нм на каждую дату.Как только это будет завершено, я хотел бы узнать, сколько всего пассажирских, грузовых и т. Д. Судов было подсчитано в каждой DOS за весь период времени ... Я могу найти действительно трудоемкие способы сделать это, но я уверен, что с помощью mutate ифункции суммирования в dplyr есть более эффективный способ запустить это ...

вот фиктивный фрейм данных:

df<- structure(list(date = structure(c(17622, 17623, 17624, 17625, 
17626, 17627, 17622, 17623, 17624, 17625, 17626, 17627), class = "Date"), 
    `Passenger(6X)` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    `Cargo(7X)` = c(2, 0, 2, 2, 2, 3, 5, 4, 7, 6, 7, 4), `Tanker(8X)` = c(0, 
    0, 0, 0, 0, 0, 0, 3, 1, 0, 1, 0), Otherb = c(`5` = 0, `6` = 0, 
    `7` = 0, `8` = 0, `9` = 0, `10` = 0, `144` = 0, `154` = 0, 
    `164` = 0, `174` = 0, `184` = 0, `194` = 0), DOS = c("0-12nm", 
    "0-12nm", "0-12nm", "0-12nm", "0-12nm", "0-12nm", "0-100nm", 
    "0-100nm", "0-100nm", "0-100nm", "0-100nm", "0-100nm")), class = "data.frame", row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 1454L, 1455L, 1456L, 1457L, 1458L, 1459L))

В этом примере 1 апреля 2018 года грузовые суда в12-100nm должно быть 3 - выходные данные могут быть в форме новых столбцов и т. Д. ... в моем реальном наборе данных у меня фактически есть 4 различных расстояния от берега и за год дат .... так что я думаю, что dplyr этоЛучший способ пойти на это - любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Если я хорошо понимаю ваш вопрос, вы сможете использовать dplyr, чтобы получить его.diff поле в следующем примере:

library(dplyr)
df %>%
  mutate(Total = `Passenger(6X)` + `Cargo(7X)` + `Tanker(8X)` + `Otherb`) %>%
  group_by(date) %>%
  mutate(diff = ifelse(row_number() == 1, Total, Total - lag(Total)))
   date       `Passenger(6X)` `Cargo(7X)` `Tanker(8X)` Otherb DOS     Total  diff
   <date>               <dbl>       <dbl>        <dbl>  <dbl> <chr>   <dbl> <dbl>
 1 2018-04-01               0           2            0      0 0-12nm      2     2
 2 2018-04-02               0           0            0      0 0-12nm      0     0
 3 2018-04-03               0           2            0      0 0-12nm      2     2
 4 2018-04-04               0           2            0      0 0-12nm      2     2
 5 2018-04-05               0           2            0      0 0-12nm      2     2
 6 2018-04-06               0           3            0      0 0-12nm      3     3
 7 2018-04-01               0           5            0      0 0-100nm     5     3
 8 2018-04-02               0           4            3      0 0-100nm     7     7
 9 2018-04-03               0           7            1      0 0-100nm     8     6
10 2018-04-04               0           6            0      0 0-100nm     6     4
11 2018-04-05               0           7            1      0 0-100nm     8     6
12 2018-04-06               0           4            0      0 0-100nm     4     1
1 голос
/ 24 апреля 2019

Опция 1:

df %>% 
       group_by(date) %>% 
       summarise_at(
          vars(`Cargo(7X)`, `Tanker(8x)`), 
          funs(.[DOS == '0-100nm'] - .[DOS == '0-12nm'])
    )

#   date       `Cargo(7X)`  `Tanker(8x)`
# 1 2018-04-01           3            0
# 2 2018-04-02           4            3
# 3 2018-04-03           5            1
# 4 2018-04-04           4            0
# 5 2018-04-05           5            1
# 6 2018-04-06           1            0

Опция 2:

df %>% 
   group_by(date, DOS) %>% 
   summarise_at(vars(`Cargo(7X)`, `Tanker(8x)`), funs(sum)) %>% 
   gather(-(date:DOS), key = Ship, value = Value) %>%
   spread(key = DOS, value = Value) %>% 
   mutate('12-100nm' = `0-100nm`- `0-12nm`)

#    date       Ship       `0-100nm` `0-12nm` `12-100nm`
#  1 2018-04-01 Cargo(7X)          5        2          3
#  2 2018-04-01 Tanker(8X)         0        0          0
#  3 2018-04-02 Cargo(7X)          4        0          4
#  4 2018-04-02 Tanker(8X)         3        0          3
#  5 2018-04-03 Cargo(7X)          7        2          5
#  6 2018-04-03 Tanker(8X)         1        0          1
#  7 2018-04-04 Cargo(7X)          6        2          4
#  8 2018-04-04 Tanker(8X)         0        0          0
#  9 2018-04-05 Cargo(7X)          7        2          5
# 10 2018-04-05 Tanker(8X)         1        0          1
# 11 2018-04-06 Cargo(7X)          4        3          1
# 12 2018-04-06 Tanker(8X)         0        0          0
...