基于特定因素和日期以及值汇总的 dplyr 计算
Calculations with dplyr based on specific factors and dates and summaries of values
我有一个数据框,其中包含特定日期在特定离岸距离 (DOS) 的不同类别船舶的计数,例如0-12nm 和 0-100nm - 我想从 0-100nm 中减去 0-12nm DOS 范围内的船只,这样我就可以计算出有多少,例如"passenger" 船只在每个日期仅在 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))
在这个例子中,2018 年 4 月 1 日,12-100 海里的货船应该是 3 - 输出可以是新列等的形式......在我的真实数据集中,我实际上有 4 个不同的距离离岸和超过一年的约会....所以我认为 dplyr 是最好的方法 - 任何帮助将不胜感激。
选项 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
如果我很好地理解你的问题,你应该能够使用 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
我有一个数据框,其中包含特定日期在特定离岸距离 (DOS) 的不同类别船舶的计数,例如0-12nm 和 0-100nm - 我想从 0-100nm 中减去 0-12nm DOS 范围内的船只,这样我就可以计算出有多少,例如"passenger" 船只在每个日期仅在 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))
在这个例子中,2018 年 4 月 1 日,12-100 海里的货船应该是 3 - 输出可以是新列等的形式......在我的真实数据集中,我实际上有 4 个不同的距离离岸和超过一年的约会....所以我认为 dplyr 是最好的方法 - 任何帮助将不胜感激。
选项 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
如果我很好地理解你的问题,你应该能够使用 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