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

标签 r dplyr posixlt

我最近遇到了 dplyr 并且 - 作为一个新手 - 非常喜欢它。因此,我尝试将我的一些 base-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 年后重温我的问题,我意识到我忘记将其标记为已回答。然而,这也让我有机会记录这种(相对)简单的类型转换如何(同时)用 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 文档和/或如何处理本地时区。

关于r - dplyr - mutate_each - 对 POSIXlt 的 colswise 强制失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27641129/

相关文章:

r - 从 R 中的数据框中获取净值作为比例

r - 将因子转换为 R 中的日期/时间

r - 在因子组合中添加缺失的行

r - 过滤 R 中的任何缺失值

r - 使用两个数据框创建 geom_tile 图

R - 从二维核密度估计中获取联合概率

用行值替换变量名,反之亦然

r - POSIXlt 组件的提取在 R 3.4.4 中运行良好,但在 R 3.5.0 中出现错误。为什么?

r - 将列转换为带有空格和毫秒的日期格式

r - 如何在 R 中将数据与特定范围内的平线拟合?