r - 使用 dplyr 非标准评估创建多个函数

标签 r dplyr

我正在尝试使用 mutate_() 创建多个列,其中每个列都基于使用不同输入调用的自定义函数。我可以使用 paste() 创建多个带引号的函数调用,但这不起作用,因为 dplyr 的 NSE 需要公式 (~) 而不是带引号的字符串才能找到函数。如何在下面写“dots =”行以便可以找到该函数?我尝试使用 ~、as.formula() 和lazyeval::interp() 进行试验,但都无法正常工作。我的实际“前缀”是一个长向量,所以我不想单独写出每个新列的函数调用。谢谢

library(dplyr)
library(lazyeval)
library(nycflights13)

myfunc = function(x, y) { x - y }

# this works
flights1 <- mutate(flights, dep_time_sched = myfunc(dep_time, dep_delay), 
                            arr_time_sched = myfunc(arr_time, arr_delay))

# this doesn't - Error: could not find function "myfunc"
prefixes <- c('dep', 'arr')
dots = as.list(paste0('myfunc(', 
                       paste0(prefixes, '_time'), ', ', 
                       paste0(prefixes, '_delay)')))
flights2 <- mutate_(flights, .dots = setNames(dots, paste0(prefixes, '_time_sched')))

最佳答案

您可以通过使用 interplapply 来循环访问您的前缀并获取 mutate_ 所需格式的列表。

    dots = lapply(prefixes, function(var) interp(~myfunc(x, y), 
                                        .values = list(x = as.name(paste0(var, "_time")),
                                                    y = as.name(paste0(var, "_delay")))))
    dots

[[1]]
~myfunc(dep_time, dep_delay)
<environment: 0x0000000019e51f00>

[[2]]
~myfunc(arr_time, arr_delay)
<environment: 0x0000000019f1e5b0>

这给出了与您的 flights1 相同的结果。

flights2 = mutate_(flights, .dots = setNames(dots, paste0(prefixes, '_time_sched')))
identical(flights1, flights2)
[1] TRUE

关于r - 使用 dplyr 非标准评估创建多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32897189/

相关文章:

r - 在 ifelse 语句中联合

r - 使用 dplyr 创建一个按组规范化的新列

r - 如何在R中识别跨年的添加/删除

根据另一个因素对facet_wrap/facet_grid中的面板进行重新排序,并多次出现

r - 有条件地将值从一列粘贴到R中的另一列

r - 如何根据两个变量对数据进行子集化

r - 如何使用带传单的控制层面板显示/隐藏图例?

R函数打印并分配返回列表的第一个元素,然后可以使用管道

r - Gather_ 不起作用。在标准评估模式下引用和〜ing不应该具有相同的效果吗?

r - 在 R 看门人包中使用 `make_clean_names` 保留重复项