如何解决R strptime未传送到数据帧
library(dplyr)
names <- c('a','b','c')
dates1 <- c('2020-08-14','2020-08-15','2020-08-16')
dates2 <- c('2019-08-14','2019-08-15','2019-08-16')
df <- data.frame(names,dates1,dates2)
print(colnames(df))
timestamps <- df %>% select(dates1,dates2) %>%
strptime('%Y-%m-%d')
print(timestamps)
为什么timestamps
是一对NA
?如何获得将strptime
正确应用于这些日期时间字符串的方法?
解决方法
您正在将sptrptime
应用于数据框,而应将其应用于列
library(dplyr)
df %>% mutate(across(starts_with('date'),strptime,'%Y-%m-%d'))
# names dates1 dates2
#1 a 2020-08-14 2019-08-14
#2 b 2020-08-15 2019-08-15
#3 c 2020-08-16 2019-08-16
由于列中只有日期信息,因此可以使用as.Date
:
df %>% mutate(across(starts_with('date'),as.Date))
,
这是两列的data.frame,如果打算通过用as.POSIXct
遍历列来转换为DateTime
类,则可以使用across
library(dplyr) # >= 1.00
out <- df %>%
select(dates1,dates2) %>%
mutate(across(everything(),as.POSIXct))
out
# dates1 dates2
#1 2020-08-14 2019-08-14
#2 2020-08-15 2019-08-15
#3 2020-08-16 2019-08-16
如果我们使用的是dplyr
的早期版本,请使用mutate_at
或mutate_all
df %>%
select(dates1,dates2) %>%
mutate_all(as.POSIXct)
它也可以与strptime
一起使用,但是要注意结构和类POSIXlt
out2 <- df %>%
select(dates1,format = '%Y-%m-%d'))
unclass(out2$dates1)
#$sec
#[1] 0 0 0
#$min
#[1] 0 0 0
#$hour
#[1] 0 0 0
#$mday
#[1] 14 15 16
#...
关于OP最初关于管道的问题,它在单个列或向量上进行
df %>%
pull(dates1) %>%
strptime(format = '%Y-%m-%d')
#[1] "2020-08-14 CDT" "2020-08-15 CDT" "2020-08-16 CDT"
因为?strptime
的文档说输入应该是
x-要转换的对象:strptime的字符向量,可以将其转换为strftime的“ POSIXlt”对象。
如果我们不想select
,请使用选择修饰符
df %>%
mutate(across(-1,as.POSIXct))
# names dates1 dates2
#1 a 2020-08-14 2019-08-14
#2 b 2020-08-15 2019-08-15
#3 c 2020-08-16 2019-08-16
或者如果打算转换为Date
类,则只需使用as.Date
df %>%
select(dates1,dates2) %>%
mutate(across(everything(),as.Date))
注意:strptime返回list
,不推荐
另外,另一个选择是base R
df[-1] <- lapply(df[-1],format = '%Y-%m-%d')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。