通过汇总其列来转换数据框

时间:2020-09-04 15:03:17

标签: r dataframe

我有一个数据框,看起来像这样:

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

我怎么能得到它?我不知道

2 个答案:

答案 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