首页 > 解决方案 > 使用 dplyr 基于特定因素和日期以及值摘要的计算

问题描述

我有一个数据框,其中包含特定日期在离岸特定距离 (DOS) 的不同船舶分类计数,例如 0-12 海里和 0-100 海里 - 我想从 0-100 海里减去 0-12 海里 DOS 内的船舶,这样我就可以计算每个日期有多少例如“客”船仅在 12-100 海里。一旦完成,我想在总时间段内计算每个 DOS 内总共有多少乘客、货物等船只......我可以想出一个非常费力的方法来做到这一点,但我很确定变异和总结 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))

在 2018 年 4 月 1 日的这个例子中,12-100nm 的货船应该是 3 - 输出可能是新列的形式等。在我的真实数据集中,我实际上有 4 个不同的离岸距离和一年以上日期......所以我认为 dplyr 是最好的方法 - 任何帮助将不胜感激。

标签: rdplyrapplysummarize

解决方案


如果我很好地理解了您的问题,您应该可以使用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

推荐阅读