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



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

代码只是将日期时间列从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,默认的formatYYYY-MM-HH,这是OP的后中显示的格式

相关内容

  • 没有找到相关文章

最新更新