使用 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
为此,我想将以下函数应用到日期列:
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
是用单个数字而不是向量调用的。我让您来决定哪种方法更快。
使用 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
为此,我想将以下函数应用到日期列:
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
是用单个数字而不是向量调用的。我让您来决定哪种方法更快。