我有一个数据框,看起来像这样:
Date Price Type
2018-08-17 10:48:02 120 A
2018-08-17 10:55:02 100 A
2018-08-17 10:57:02 70 B
2018-08-17 10:58:07 69 B
2018-08-20 22:58:13 56 A
2018-08-21 04:19:53 79 A
2018-08-21 04:29:56 40 A
2018-08-21 09:15:07 11 B
2018-08-21 17:07:03 600 A
2018-08-21 17:57:11 225 C
我要转换“日期”列,因此它仅显示日期和小时,而对于“价格”列中的值,它们必须根据列类型每小时的总和。因此,所需的结果必须如下所示:
Date Price_sum Type
2018-08-17 10:00:00 220 A
2018-08-17 10:00:00 139 B
2018-08-20 22:00:00 56 A
2018-08-21 04:00:00 119 A
2018-08-21 09:00:00 11 B
2018-08-21 17:00:00 600 A
2018-08-21 17:00:00 225 C
我怎么能得到它?我不知道
答案 0 :(得分:1)
我们可以使用floor_date
中的lubridate
来舍入最近的时间并将这些值相加。
library(dplyr)
library(lubridate)
df %>%
group_by(Date = floor_date(ymd_hms(Date), 'hour'), Type) %>%
summarise(Price_sum = sum(Price),
n = n())
# Date Type Price_sum n
# <dttm> <chr> <int> <int>
#1 2018-08-17 10:00:00 A 220 2
#2 2018-08-17 10:00:00 B 139 2
#3 2018-08-20 22:00:00 A 56 1
#4 2018-08-21 04:00:00 A 119 2
#5 2018-08-21 09:00:00 B 11 1
#6 2018-08-21 17:00:00 A 600 1
#7 2018-08-21 17:00:00 C 225 1
答案 1 :(得分:0)
另一种尝试的方式
library(dplyr)
library(lubridate)
df %>%
mutate(Date = ymd_hms(Date),
hour_only = hour(Date)) %>%
group_by(Type, hour_only) %>%
mutate(Price2 = sum(Price)) %>%
slice(1) %>%
ungroup() %>%
arrange(Date) %>%
select(Date, Price2, Type)
# Date Price2 Type
# <dttm> <int> <chr>
# 1 2018-08-17 10:48:02 220 A
# 2 2018-08-17 10:57:02 139 B
# 3 2018-08-20 22:58:13 56 A
# 4 2018-08-21 04:19:53 119 A
# 5 2018-08-21 09:15:07 11 B
# 6 2018-08-21 17:07:03 600 A
# 7 2018-08-21 17:57:11 225 C