为什么R在将字符转换为日期时会添加一行



我正在使用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返回具有两个类(即POSIXltPOSIXt(的对象。当您使用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)

相关内容

  • 没有找到相关文章