繁体   English   中英

使用dplyr应用R数据帧中几列的功能

[英]Using dplyr to apply a function of several columns of an R data frame

使用dplyr的“动词”,如果该函数依赖于数据帧的多个列,该如何将(通用)函数应用于R数据帧的列?

这是我面临的情况类型的具体示例。 我有一个像这样的数据框:

df <- data.frame(
    d1 = c('2016-01-30 08:40:00 UTC', '2016-03-06 09:30:00 UTC'),
    d2 = c('2016-01-30 16:20:00 UTC', '2016-03-06 13:20:00 UTC'),
    tz = c('America/Los_Angeles', 'America/Chicago'), stringsAsFactors = FALSE)

我想将UTC时间转换为本地时间,以获得这样的数据帧:

                   d1                  d2                  tz
1 2016-01-30 00:40:00 2016-01-30 08:20:00 America/Los_Angeles
2 2016-03-06 03:30:00 2016-03-06 07:20:00     America/Chicago

为此,我想将以下函数应用于日期列,该函数使用lubridate库将UTC时间转换为本地时间:

getLocTime <- function(d, tz) {
    as.character(with_tz(ymd_hms(d), tz))
}

使用dplyr,看来转型

df %>% mutate(d1 = getLocTime(d1, tz), d2 = getLocTime(d2, tz))

应该可以。 但是,它失败并显示Error in eval(expr, envir, enclos): invalid 'tz' value

我设法将时间转换为本地时间的唯一方法是分配费力

df[c('d1', 'd2')] <- lapply(c('d1', 'd2'),
                            function(x) unlist(Map(getLocTime, df[[x]], df$tz)))

实际上,是否存在使用dplyr习语执行此转换的自然方法?

如lukeA所述,由于没有对getLocTime进行矢量化,因此会出现问题。 因此,您可以按照建议对函数进行矢量化处理,或者按行执行函数:

 df %>% rowwise() %>% mutate(d1 = getLocTime(d1, tz), d2 = getLocTime(d2, tz))

这样可以确保使用单个数字而不是向量调用getLocTime 我由您决定哪种方法更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM