dplyr - mutate_each - 对POSIXlt的colswise强制失败

时间:2014-12-24 18:51:24

标签: r dplyr posixlt

我最近遇到了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函数)......

1 个答案:

答案 0 :(得分:1)

大约4年后重新审视我的问题,我意识到我忘记将其标记为已回答。但是,这也使我有机会记录一下如何(相对)简单地使用"SELECT section_id FROM db.table WHERE contractor_id = '1'" dplyr优雅地解决这种类型的强制转换。

主要经验教训:

  1. 从不从未将POSIXlt与数据帧一起使用(及其后继兄弟小声说, 尽管您现在可以使用列表列)。
  2. 使用lubridate软件包中有用的解析器功能强制日期时间戳。

对于上面的例子

lubridate

将强制MVT_TIME_UTC中的时间戳。请查阅lubridate上的文档,以了解其他解析器和/或如何处理本地时区。