使用索引或任何其他工具将两行代码合并为一行

Merging two lines of code into one using indexing or any other tool

我有两行不同的代码,它们执行相同的事情,但针对两个不同的列。我尝试了不同的方法将它们合并到一行代码中,但每次都会出错。

代码只是将日期时间列从 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))

将强制转换为 class "POSIXct".
如果您知道 date/time 列是唯一以 "_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,默认 formatYYYY-MM-HH,这是 OP 的 post

中显示的格式