我有两行不同的代码,它们执行相同的事情,但用于两个不同的列。我尝试了不同的方法将它们合并到一行代码中,但每次我都会出错。
代码只是将日期时间列从chr转换为dttm:
df[["started_at"]] <- as.POSIXct(df[["started_at"]], format = "%Y-%m-%d %H:%M:%S") %>% ymd_hms()
df[["ended_at"]] <- as.POSIXct(df[["ended_at"]], format = "%Y-%m-%d %H:%M:%S") %>% ymd_hms()
如果您对包dplyr
感到满意,则可以将mutate()
与across()
一起使用。
输入
我创建了一个用于演示的伪数据帧df
。
library(dplyr)
library(lubridate)
# dummy dataframe
df <- tibble(started_at = "2020-01-30 11:11:11",
ended_at = "2020-12-06 15:43:26",
ID = "123")
# A tibble: 1 × 3
started_at ended_at ID
<chr> <chr> <chr>
1 2020-01-30 11:11:11 2020-12-06 15:43:26 123
解决方案
df <- df %>% mutate(across(c(started_at, ended_at),
~ as.POSIXct(.x, format = "%Y-%m-%d %H:%M:%S") %>%
ymd_hms()))
# A tibble: 1 × 3
started_at ended_at ID
<dttm> <dttm> <chr>
1 2020-01-30 11:11:11 2020-12-06 15:43:26 123
中的任何一个
df %>% mutate(across(c(started_at, ended_at), as.POSIXct))
df %>% mutate(across(c(started_at, ended_at), ymd_hms))
将强制为类"POSIXct"
如果您知道日期/时间列是唯一以"_at"
结尾的列,您可以将上面的代码简化为任何
df %>% mutate(across(ends_with("_at"), as.POSIXct))
df %>% mutate(across(ends_with("_at"), ymd_hms))
在这两种情况下,规则都是
- 如果您想避免加载另一个包
lubridate
,请使用调用as.POSIXct
的代码行 - 如果您需要更多的日期和时间函数,那么加载并使用包
lubridate
可能是个好主意
正如OP显示的base R
代码一样,用于同时转换多列的base R
变体可以使用lapply
df[c("started_at", "ended_at")] <- lapply(df[c("started_at", "ended_at")],
as.POSIXct)
仅当format
不是默认格式时才需要它。对于POSIXct/POSIXlt
,默认的format
是YYYY-MM-HH
,这是OP的后中显示的格式