微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在将字符转换为日期时 R 添加额外的行

如何解决为什么在将字符转换为日期时 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。