dplyr - mutate_each - 列处理向 POSIXlt 的强制转换失败

3

最近我接触到dplyr工具,作为一个新手,我非常喜欢它。因此,我正在尝试将一些基础R代码转换为dplyr代码。

在处理航空交通管制数据时,我正在努力使用lubridate和as.POSIXlt来解析嵌入在mutate_each()调用中的时间戳。我需要POSIXlt格式,因为我之后必须处理不同位置的本地时间。读取数据会得到一个字符型数据框。以下是一个简单的例子:

ICAO_ADEP <- c("DGAA","ZSPD","UAAA","RJTT","KJFK","WSSS")
MVT_TIME_UTC <- c("01-Jan-2013 04:02:24", NA,"01-Jan-2013 04:08:18", NA,"01-Jan-2013 04:17:11","01-Jan-2013 04:21:52")
flights <- data.frame(ICAO_ADEP, MVT_TIME_UTC)

我写的函数如下所示:
make_POSIXlt <- function(vec, tz="UTC"){
vec <- parse_date_time(vec, orders="dmy_hms", tz=tz)
vec <- as.POSIXlt(vec, tz=tz)
}

当使用单个列执行代码时,它可以正常工作:

flights$MVT_TIME_UTC <- make_POSIXlt(flights$MVT_TIME_UTC)

如果我运行以下的dplyr代码,该函数将失败:
flights$BLOCK_TIME_UTC <- mutate_each(flights, funs(make_POSIXlt(.)), MVT_TIME_UTC)
Error: wrong result size (9), expected 6 or 1

问题应该与as.POSIXlt调用相关联。如果将此行注释掉,则代码在mutate_each中运行,并将时间戳强制转换为POSIXct。
您有没有任何想法/帮助,究竟哪里出了问题? 显然,我的数据有几个时间戳,我想使用mutate_each(或任何其他适合的dplyr函数)进行强制转换...

4
dplyr默认会使用data.table,但是data.table不支持POSIXlt格式(详见https://dev59.com/42Ei5IYBdhLWcg3wN6Jt)。请使用POSIXct格式代替。 - hrbrmstr
1
@Ray 我可以向您保证,您的问题绝非显而易见。 - David Arenburg
1
@hrbrmstr 我不明白为什么dplyr默认会在data.frame上使用data.table... dplyr的data.frames支持posixlt吗? - Arun
3
数据框(无论哪种类型)也不太能很好地接受 POSIXlt 类型,因为 POSIXlt 是一个多级列表结构,其中每个条目都是一个命名列表。我不确定数据框出了什么问题,但它确实有问题。向 dplyr 添加警告将使该软件包在 data.frame 的帮助页面上占据优势,因为该页面没有这样的警告。 - IRTFM
1
请参阅 dplyr github 上关于 POSIXlt 的问题,链接在这里这里 - Henrik
显示剩余3条评论
1个回答

1
重新审视我的问题,大约四年后,我意识到我忘记将其标记为已解决。然而,这也给了我机会记录一下如何使用和优雅地(相对简单地)解决这个问题。
关键教训:
1. 绝不要在数据框中(以及它的后来兄弟tibble,尽管您现在可以使用列表列)使用POSIXlt。 2. 使用包中有用的解析器函数强制转换日期时间戳。
对于上面的示例:
ICAO_ADEP <- c("DGAA","ZSPD","UAAA","RJTT","KJFK","WSSS")
MVT_TIME_UTC <- c("01-Jan-2013 04:02:24", NA,"01-Jan-2013 04:08:18", NA,"01-Jan-2013   04:17:11","01-Jan-2013 04:21:52")
flights <- data.frame(ICAO_ADEP, MVT_TIME_UTC)

flights <- flights %>% mutate(MVT_TIME_UTC = lubridate::dmy_hms(MVT_TIME_UTC)

将强制转换MVT_TIME_UTC中的时间戳。有关其他解析器和/或如何处理本地时区的信息,请查看lubridate文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接