我正在使用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)