Периоды Lubridate портятся после использования dplyr - PullRequest
2 голосов
/ 19 марта 2020

Я использую R-3.6.3, lubridate_1.7.4, dbplyr_1.4.2.

Представляет:

df_0 <- tibble(period_type  = c("a", "b", "c"), 
               period_value = c("1:1:1", "2:2:2", "4:4:4")) %>% 
        mutate(period_value = hms(period_value))

df_0
## A tibble: 3 x 2
#  period_type period_value
#  <chr>       <Period>
#1 a           1H 1M 1S
#2 b           2H 2M 2S
#3 c           4H 4M 4S

Пока все хорошо. Теперь, используя dplyr spread:

df_0 %>% spread(period_type, period_value)
## A tibble: 1 x 3
#  a        b        c
#  <Period> <Period> <Period>
#1 1H 1M 1S 1H 1M 2S 1H 1M 4S

Но результат должен быть

## A tibble: 1 x 3
#  a        b        c
#  <Period> <Period> <Period>
#1 1H 1M 1S 2H 2M 2S 4H 4M 4S

Часы и минуты испорчены, но, как ни странно, не секунды. Это ошибка или я что-то не так делаю?

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Проблема не в глаголе тидира, так как spread () не исчезает, но больше не находится в активной разработке

Вместо lubridate, попробуйте функцию parse_hms () пакета хмс:

df_0 <- tibble(period_type  = c("a", "b", "c"), 
           period_value = c("1:1:1", "2:2:2", "4:4:4")) %>% 
  mutate(period_value = hms::parse_hms(period_value))

df_0 %>% spread(period_type, period_value)
# or
df_0 %>% pivot_wider(names_from=period_type, values_from=period_value)

# A tibble: 1 x 3
  a        b        c       
  <time>   <time>   <time>  
1 01:01:01 02:02:02 04:04:04
2 голосов
/ 19 марта 2020

Как прокомментировал Эдвард, pivot_wider() заменил spread(). Тем не менее, он, кажется, не обрабатывает переменные класса периода. Поэтому вам нужно преобразовать значения периода, повернуть, а затем преобразовать обратно.

library(dplyr)
library(lubridate)

df_0 %>%
  mutate(period_value = period_to_seconds(period_value)) %>%
  pivot_wider(names_from = period_type, values_from = period_value) %>%
  mutate_all(seconds_to_period)

# A tibble: 1 x 3
  a        b        c       
  <Period> <Period> <Period>
1 1H 1M 1S 2H 2M 2S 4H 4M 4S
...