问题描述
我正在使用 strptime
将字符数据类型的向量转换为 R 中的日期数据类型。
当我在转换后使用 sapply
检查数据类型时,它给了我额外的一行。
下面的最小示例:
test_dates = c("2020-10-01","2019-08-09","2018-07-01")
sapply(test_dates,class)
2020-10-01 2019-08-09 2018-07-01
"character" "character" "character"
test_dates = strptime(test_dates,"%Y-%m-%d")
sapply(test_dates,class)
[,1] [,2] [,3]
[1,] "POSIXlt" "POSIXlt" "POSIXlt"
[2,] "POSIXt" "POSIXt" "POSIXt"
最后的第二行是我不确定的部分。我不知道这是对 sapply
的误解,还是与 R 存储时间/日期的方式有关。如下,数据的第二行没有任何内容。
test_dates[1][1]
[1] "2020-10-01 BST"
test_dates[1][2]
[1] NA
在此先感谢您的帮助。
解决方法
R 对象可以有多个类。您看到的第二行是因为 strptime
返回具有两个类的对象,即 POSIXlt
和 POSIXt
。当您使用 sapply
时,它会将数据简化为一个可能令人困惑的矩阵。
也许 lapply
的输出不会那么混乱。
lapply(test_dates,class)
#[[1]]
#[1] "POSIXlt" "POSIXt"
#[[2]]
#[1] "POSIXlt" "POSIXt"
#[[3]]
#[1] "POSIXlt" "POSIXt"
此外,向量只能有一个类,因此您可以检查整个向量的 class
而不是每个单独的元素,因为无论如何它都会返回相同的值。
class(test_dates)
#[1] "POSIXlt" "POSIXt"
,
您可以使用 lubridate 包(ymd 函数)轻松地将此向量转换为日期。类似的东西:
test_dates <- c("2020-10-01","2019-08-09","2018-07-01")
new_dates <- lubridate::ymd(test_dates)
class(new_dates)
希望有帮助:D
,我们也可以使用 map
library(purrr)
map(test_dates,class)