给定:一个简单的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
答案 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;
[]