使用索引或任何其他工具将两行代码合并为一行
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
,默认 format
是 YYYY-MM-HH
,这是 OP 的 post
中显示的格式
我有两行不同的代码,它们执行相同的事情,但针对两个不同的列。我尝试了不同的方法将它们合并到一行代码中,但每次都会出错。
代码只是将日期时间列从 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
,默认 format
是 YYYY-MM-HH
,这是 OP 的 post