【问题标题】:dplyr - mutate_each - colswise coercion to POSIXlt failsdplyr - mutate_each - colswise 强制转换为 POSIXlt 失败
【发布时间】:2015-02-22 19:42:46
【问题描述】:

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

【问题讨论】:

  • dplyr 将默认使用 data.table 和 data.table does not support POSIXlt。请改用 POSIXct。
  • @Ray 我可以向你保证,你的问题远非显而易见
  • @hrbrmstr 我不明白为什么 dplyr 默认会在 data.frame 上使用 data.table... dplyr 的 data.frames 是否支持 posixlt?
  • 见鬼,data.frame(任何种类)也不优雅地接受POSIXlt-class。 POSIXlt 是一个多级列表结构,每个条目都是一个命名列表。我不确定data.frames哪里出了问题,但我知道确实如此。向 dplyr 添加警告会将该软件包单独放在没有此类警告的 data.frame 的帮助页面上。
  • 参见POSIXlt 上的问题dplyr github here, here

标签: r dplyr posixlt


【解决方案1】:

大约 4 年后重新审视我的问题,我意识到我忘记将其标记为已回答。然而,这也让我有机会记录这个(相对)简单的类型强制如何(同时)用dplyrlubridate 优雅地解决。

主要经验教训:

  1. 从不将 POSIXlt 与数据框(及其后来的兄弟 tibble, 尽管您现在可以使用列表列)。
  2. 使用 lubridate 包中的有用解析器函数强制日期时间戳。

上面的例子

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 文档和/或如何处理本地时区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多