使用 dplyr spread 后润滑周期变得混乱
Lubridate periods get messed up after using dplyr spread
我正在使用 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 传播:
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
小时和分钟搞乱了,但奇怪的是秒没有。
这是一个错误还是我做错了什么?
正如爱德华评论的那样,pivot_wider()
已经取代了 spread()
。但是,它似乎不处理周期 class 的变量。因此,您需要转换周期值、枢轴,然后再转换回来。
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
问题不在于 tidyr 动词,因为 spread() isn't going away but is no longer under active development
尝试包 hms 的函数 parse_hms() 而不是 lubridate:
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
我正在使用 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 传播:
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
小时和分钟搞乱了,但奇怪的是秒没有。 这是一个错误还是我做错了什么?
正如爱德华评论的那样,pivot_wider()
已经取代了 spread()
。但是,它似乎不处理周期 class 的变量。因此,您需要转换周期值、枢轴,然后再转换回来。
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
问题不在于 tidyr 动词,因为 spread() isn't going away but is no longer under active development
尝试包 hms 的函数 parse_hms() 而不是 lubridate:
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