我有这个示例代码(它是一个因子数据类型):
> head(df$Timeframe_x1)
[1] 30/12/1899 13:12:59 30/12/1899 12:59:20 30/12/1899 11:58:26 30/12/1899 11:15:45
[5] 30/12/1899 04:17:14 30/12/1899 03:08:34
如何以有效的方式将其转换为计时器值(小时,分钟或秒),并且假定此计时器从30/12/1899 00:00:00
开始,这意味着累计0小时0分0秒? / p>
这是我目前的代码:
z <- dmy_hms(df$Timeframe_x1)
df$Hours <- hour(z)
df$Minutes <- minute(z)
df$Seconds <- second(z)
df$TotalSeconds <- df$Hours*3600 + df$Minutes*60 + df$Seconds
它有效,但我正在寻找一个更高效的,因为我必须将它应用于65列(df$timeframe_x1
到df$timeframe_x65
),而不仅仅是这一列。
答案 0 :(得分:0)
我们可以使用lapply
来执行此操作
nm1 <- paste0("Timeframe_x", 1:65)
df[nm1] <- lapply(df[nm1], f1)
其中f1
是函数
f1 <- function(x) {
z <- dmy_hms(x)
Hours <- hour(z)
Minutes <- minute(z)
Seconds <- second(z)
Hours*3600 + Minutes*60 + Seconds
}
或者可以使用tidyverse
library(tidyverse)
library(magrittr)
df %<>%
mutate_at(vars(nm1), f1)
或使用data.table
library(data.table)
setDT(df)[, (nm1) := lapply(.SD, f1), .SDcols = nm1]
答案 1 :(得分:0)
您可以使用 char a[]={'2','3','4','5'};
和difftime
来获取计时器值的时间差异。 lubridate::seconds_to_period
可以是一个很好的选择,因为OP提到他有超过65列。
dplyr::mutate_at
数据:示例数据。
library(dplyr)
library(lubridate)
# Start time for Timer
start_time <- dmy_hms("30/12/1899 00:00:00")
df %>% mutate_at(vars(starts_with("T")), dmy_hms) %>%
mutate_at(vars(starts_with("T")),
funs(Timer = seconds_to_period(difftime(. , start_time, units = "secs"))))
# ID T1 T2 T1_Timer T2_Timer
# 1 1 1899-12-30 13:12:59 1899-12-30 13:12:59 13H 12M 59S 13H 12M 59S
# 2 2 1899-12-30 12:59:20 1899-12-30 12:59:20 12H 59M 20S 12H 59M 20S
# 3 3 1899-12-30 11:58:26 1899-12-30 11:58:26 11H 58M 26S 11H 58M 26S
# 4 4 1899-12-30 11:15:45 1899-12-30 11:15:45 11H 15M 45S 11H 15M 45S
# 5 5 1899-12-30 04:17:14 1899-12-30 04:17:14 4H 17M 14S 4H 17M 14S
# 6 6 1899-12-30 03:08:34 1899-12-30 03:08:34 3H 8M 34S 3H 8M 34S
注意:我已将列名更改为Timeframe_x1 <- c("30/12/1899 13:12:59", "30/12/1899 12:59:20", "30/12/1899 11:58:26",
"30/12/1899 11:15:45", "30/12/1899 04:17:14", "30/12/1899 03:08:34")
df <- data.frame(ID = 1:6, T1 = Timeframe_x1, T2 = Timeframe_x1)
df
# ID T1 T2
# 1 1 30/12/1899 13:12:59 30/12/1899 13:12:59
# 2 2 30/12/1899 12:59:20 30/12/1899 12:59:20
# 3 3 30/12/1899 11:58:26 30/12/1899 11:58:26
# 4 4 30/12/1899 11:15:45 30/12/1899 11:15:45
# 5 5 30/12/1899 04:17:14 30/12/1899 04:17:14
# 6 6 30/12/1899 03:08:34 30/12/1899 03:08:34
str(df)
# 'data.frame': 6 obs. of 3 variables:
# $ ID: int 1 2 3 4 5 6
# $ T1: Factor w/ 6 levels "30/12/1899 03:08:34",..: 6 5 4 3 2 1
# $ T2: Factor w/ 6 levels "30/12/1899 03:08:34",..: 6 5 4 3 2 1
和T1
,以简化在SO中显示解决方案。