R lubridate: применить помощник к фрейму данных - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть данные, выглядящие так:

library(lubridate)

times <- structure(list(exp1 = c("17:19:04 \r", "17:28:53 \r", "17:38:44 \r"), 
                        exp2 = c("17:22:04 \r", "17:31:53 \r", "17:41:45 \r")), 
                        row.names = c(NA, 3L), class = "data.frame")

Я хочу преобразовать время в более удобные объекты даты и времени, что я буду делать с помощью вспомогательной функции hms() из * Пакет 1005 *.

Запуск hms() в одном столбце моего информационного кадра работает как чудо:

hms(times[,1])

[1] "17H 19M 4S" "17H 28M 53S" "17H 38M 44S"

Отлично, конечно, тогда я могу просто apply() на весь мой фрейм данных.

apply(times, 2, hms)

, который дает странный фрейм данных с некоторыми целыми числами, определенно не то, что Я ожидаю.

Как правильно преобразовать весь мой times фрейм данных с помощью функции hms()?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020
library(dplyr)
library(lubridate)

times %>% mutate_all(hms)
#OR
mutate_all(times, hms)
#         exp1        exp2
#1  17H 19M 4S  17H 22M 4S
#2 17H 28M 53S 17H 31M 53S
#3 17H 38M 44S 17H 41M 45S
2 голосов
/ 19 февраля 2020

Вместо apply можно использовать lapply, так как apply преобразуется в matrix, и он не будет содержать атрибуты, созданные hms

library(lubridate)
times[] <- lapply(times, hms)
str(times)
#'data.frame':  3 obs. of  2 variables:
# $ exp1:Formal class 'Period' [package "lubridate"] with 6 slots
#  .. ..@ .Data : num  4 53 44
#  .. ..@ year  : num  0 0 0
#  .. ..@ month : num  0 0 0
#  .. ..@ day   : num  0 0 0
#  .. ..@ hour  : num  17 17 17
#  .. ..@ minute: num  19 28 38
# $ exp2:Formal class 'Period' [package "lubridate"] with 6 slots
#  .. ..@ .Data : num  4 53 45
#  .. ..@ year  : num  0 0 0
#  .. ..@ month : num  0 0 0
#  .. ..@ day   : num  0 0 0
#  .. ..@ hour  : num  17 17 17
#  .. ..@ minute: num  22 31 41

С devel версия dplyr, мы можем использовать mutate с across

library(dplyr)
times %>%
    mutate(across(everything(), hms))
...