我使用RPostgreSQL
从Postgres数据库中提取数据,在导入R时将时间戳转换为系统时区。因此,导入后我想设置所有时间戳的时区到UTC。我想我可以使用dplyr
和lubridate
来优雅地执行此操作,如下所示:
df %>%
mutate_if(lubridate::is.POSIXct, lubridate::force_tz(., tzone='UTC')) -> df
但这会抛出
Error in UseMethod("as.fun_list") :
no applicable method for 'as.fun_list' applied to an object of class "data.frame"
所以我显然错误地使用mutate_if()
答案 0 :(得分:2)
这有效:
df %>%
dplyr::mutate_if(lubridate::is.POSIXct,
function(x) lubridate::force_tz(x, tzone='UTC')) -> df
同样的purrr
解决方案:
df %>%
purrr::map_if(lubridate::is.POSIXct,
~ lubridate::force_tz(., tzone='UTC')) %>%
as_data_frame -> df
这是否优雅?
答案 1 :(得分:1)
要在mutate_if
中使用点表示法,该函数必须包含在funs
中。
library(lubridate)
df %>%
mutate_if(is.POSIXct, funs(force_tz(., tzone='UTC')))
但是,目前您无法在package::
中使用funs
表示法。相反,你必须像我上面那样显式加载包(相关的github问题here)。