为什么sapply没有使用lubridate的parse_date_time而lapply没有?

时间:2016-09-13 05:08:19

标签: r lapply sapply lubridate

给定:一个简单的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")

这是一个热切的电话:

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

和lapply电话:

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

我理解sapply返回它可以的最简单的数据结构,lapply返回一个列表。如果工作顺利,那么df2 <- data.frame(df2)之后会有2016-06-27 12:29:05,这样我就可以按照目标&#39;中所述的数据框进行操作。 (请注意,我使用成功的lapply返回列表执行此操作)。

我的问题是为什么parse_date_time函数在lapply中的行为与预期的一样,但在sapply中却没有?作为参考,这里分别是lapply和sapply调用的示例输出:

1467030545

Mainform

1 个答案:

答案 0 :(得分:3)

原因是sapply默认为simplify = TRUE,当list元素的长度或维度相同时,它会简化为vector或{{1 }}。在内部,日期时间类存储为数字,

matrix

typeof(parse_date_time(df$starttime, orders = c("ymd_hms", "mdy_hms"), tz = "ETZ")) #[1] "double" 是&#39; POSIXct`

class

所以它在执行class(parse_date_time(df$starttime, orders = c("ymd_hms", "mdy_hms"), tz = "ETZ")) #[1] "POSIXct" "POSIXt" 转换时强制执行此操作,而在matrix中它会保留list格式。

如果我们对class感兴趣,那么我们会制作一份&#39; df&#39;并使用data.frame获得与&#39; df&#39;

相同的结构
[]