【问题标题】:How do I properly use ifelse to handle a timestamp mutate in R?如何正确使用 ifelse 处理 R 中的时间戳变异?
【发布时间】:2020-01-03 00:16:44
【问题描述】:

我正在尝试将时间戳分解为一小时的日期。 csv 中的时间戳如下所示:2018-12-17T12:25:00Z。时间戳本身没有 NA 或违规行为。但是当我运行代码块时

 x %>% 
    mutate(
      chicago_mkt_interval = with_tz(gmt_mkt_interval, "America/Chicago"),
      pricedate = as_date(floor_date(chicago_mkt_interval - minutes(1), "day")),
      hour = hour(ceiling_date(chicago_mkt_interval - minutes(1), "hour")),
      hour = ifelse(hour == 0L, 24L, hour),
      minute = minute(chicago_mkt_interval - minutes(1)) + 1
    ) %>% 
    select(-chicago_mkt_interval) %>% 
    select(pricedate, hour, gmt_mkt_interval, everything())

我收到一个错误

Error in mutate_impl(.data, dots) : 
  Evaluation error: missing value where TRUE/FALSE needed.
Calls: %>% ... <Anonymous> -> mutate -> mutate.tbl_df -> mutate_impl -> .Call

这里有一个sn-p的回溯:

Error: Column `4` cannot have NA as name 
12.
stop(structure(list(message = "Column `4` cannot have NA as name", 
    call = NULL, cppstack = NULL), class = c("Rcpp::exception", 
"C++Error", "error", "condition"))) 
11.
mutate_impl(.data, dots, caller_env()) 
10.
mutate.tbl_df(., chicago_mkt_interval = with_tz(gmt_mkt_interval, 
    "America/Chicago"), pricedate = as_date(floor_date(chicago_mkt_interval - 
    minutes(1), "day")), hour = hour(ceiling_date(chicago_mkt_interval - 
    minutes(1), "hour")), hour = ifelse(hour == 0L, 24L, hour),  ... 

我是 R 新手,所以不确定是否是修复或改进错误处理的最佳方法。

【问题讨论】:

  • 请用dput展示一个可重复的小例子
  • 对于错误处理,您可以使用 base R 中的 tryCatchpurrr 中的 safely/possibly
  • R 没有时间对象,只有日期时间对象,所以最好将日期和时间部分放在一起,只在需要时才拆分。下面 Ronak 的基本 R 答案就是一个很好的例子。

标签: r if-statement na dplyr


【解决方案1】:

您可以尝试将时间戳转换为POSIXct 类,然后从中提取日期和小时。

library(dplyr)
library(lubridate)

x %>%
  mutate(chicago_mkt_interval = ymd_hms(gmt_mkt_interval), 
         pricedate = as.Date(chicago_mkt_interval), 
         hour = hour(chicago_mkt_interval))

或者在基础R中

x$chicago_mkt_interval <- as.POSIXct(x$gmt_mkt_interval, 
                                     format = '%Y-%m-%dT%T', tz = "UTC")
transform(x, pricedate = as.Date(chicago_mkt_interval), 
             hour = as.integer(format(chicago_mkt_interval, "%H")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 2010-12-30
    • 2023-03-14
    • 2012-09-09
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多