为什么sapply不能使用lubridate的parse_date_time而lapply却不使用?

船长

给定:一个简单的4x2数据帧,其中填充了字符类型的数据

目标:相同的数据框,但所有值均替换为对它们应用以下lubridate函数调用的结果: parse_date_time(df, orders = c ("ymd_hms", "mdy_hms"), tz = "ETZ")

似乎使用lapply可以正常工作。使用sapply时,parse_date_time函数返回奇怪的大整数。

数据如下:

df <- as.data.frame(stringsAsFactors = FALSE, matrix(c("2014-01-13 12:08:02", "2014-01-13 12:19:46", "2014-01-14 09:59:09", "2014-01-14 10:05:09", "6-18-2016 17:43:42", "6-18-2016 18:06:59", "6-27-2016 12:16:47", "6-27-2016 12:29:05"), nrow = 4, ncol = 2, byrow = TRUE))

colnames(df) <- c("starttime", "stoptime")

这是sapply调用:

df2 <- sapply(df, FUN = function(column) { parse_date_time(column, orders = c("ymd_hms", "mdy_hms"), tz = "ETZ") })

和讨厌的电话:

df2 <- lapply(df, FUN = function(column) { parse_date_time(column, orders = c("ymd_hms", "mdy_hms"), tz = "ETZ") })

我知道sapply返回它可以实现的最简单的数据结构,而lapply返回一个列表。如果工作得很顺利,那么后面将是df2 <- data.frame(df2)这样,这样我将具有“目标”中所述的所需数据帧(请注意,我确实使用成功的lapply返回列表来做到这一点)。

我的问题是,为什么parse_date_time函数在lapply中表现出预期,但在sapply中表现却不如预期?作为参考,以下分别是lapply和sapply调用的示例输出:

2016-06-27 12:29:05

1467030545

阿克伦

原因是sapply默认情况下具有,simplify = TRUE并且当list元素的长度或尺寸相同时,它会简化为avectormatrix在内部,日期时间类存储为数字,

typeof(parse_date_time(df$starttime, orders = c("ymd_hms", "mdy_hms"), tz = "ETZ"))
#[1] "double"

class“ POSIXct”

class(parse_date_time(df$starttime, orders = c("ymd_hms", "mdy_hms"), tz = "ETZ"))
#[1] "POSIXct" "POSIXt"  

因此在matrix转换时会强制转换,而在转换时list会保留class格式。

如果我们对感兴趣data.frame,则我们创建'df'的副本并用于[]获取与'df'相同的结构

df2 <- df
df2[] <-  lapply(df, FUN = function(column) {
     parse_date_time(column, orders = c("ymd_hms", "mdy_hms"), tz = "ETZ")
   })

df2
#           starttime            stoptime
#1 2014-01-13 12:08:02 2014-01-13 12:19:46
#2 2014-01-14 09:59:09 2014-01-14 10:05:09
#3 2016-06-18 17:43:42 2016-06-18 18:06:59
#4 2016-06-27 12:16:47 2016-06-27 12:29:05

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Lubridate-如何使用parse_date_time正确解析十进制分钟

与tibble合并时,使用lubridate中的parse_date_time()解析的日期会丢失其格式

使用 parse_date_time 解析日期:为什么“2004-04-04 02:00”会失败?

为什么在C ++ 17上不能使用`{}`而不使用`()`构造此派生类?

rpm为什么不能使用xterm?

为什么不能使用HTTP代理?

为什么我不能使用asyncTask

为什么不能使用下拉列表?

为什么不能使用Override注释?

为什么ckan不能使用中文?

R dplyr :: mutate_和lubridate :: parse_date_time标准评估无法正常工作

如何使用 parse_date_time() 将日期变量转换为不同的日期时间变量?

为什么使用PhantomJS不能使用该xpath?

为什么在Clojure中将map映射为`into`映射(`(into {} ,,,)`),而不能使用`vectors`,而不能使用`list`?

为什么不能使用auto声明变量?

为什么QEMU不能使用linux内存缓冲内存?

为什么我不能使用Python加载此页面?

为什么我不能使用低版本的buildTools?

为什么我的 crontab 不能使用 /etc/crontab 文件

为什么 cat 不能使用 xargs 中的参数 -0?

为什么我不能使用链接的功能?

为什么MySQL不能使用部分主键索引?

为什么此解决方案不能使用for循环?

为什么在Swift中不能使用UIRefreshControl?

为什么我不能使用预计在JUnit 4中

为什么我不能使用numpy.logaddexp.reduce?

为什么我不能使用int访问map键?

为什么我不能使用 ConstaintLayout 属性

为什么鼠标不能使用此表单 (html)