【问题标题】:Error when using dplyr::mutate with mapply将 dplyr::mutate 与 mapply 一起使用时出错
【发布时间】:2016-12-22 14:22:35
【问题描述】:

我想在列表中的两个数据帧中的每一个上使用 mutate,将 z = 3 列添加到第一个,将 z = 4 列添加到第二个(并返回两个数据帧的列表)。

dfs <- list(data.frame(x = 1), data.frame(y = 2))
mapply(dplyr::mutate, dfs, z = 3:4, SIMPLIFY = FALSE)
#> Error in lazyeval::lazy_dots(...): Promise has already been forced

我出了什么问题,我应该如何去做我想做的事?

【问题讨论】:

    标签: r dplyr mapply


    【解决方案1】:

    使用匿名函数有效:

    mapply(function(df, z) mutate_(df, z=z), dfs, 3:4, SIMPLIFY=FALSE)
    #[[1]]
    #  x z
    #1 1 3
    #
    #[[2]]
    #  y z
    #1 2 4
    

    【讨论】:

    • 谢谢,这正是我想要的。知道为什么我尝试的方法失败了吗?
    • 或者没有匿名Map(mutate_, dfs, z = 3:4)
    • @RoryNolan 只需将原始代码更改为使用mutate_(“编程友好”版本)就可以正常工作。匿名函数是不必要的。 mapply(dplyr::mutate_, dfs, z = 3:4, SIMPLIFY = FALSE)。我们也可以讨论 NSE、惰性评估等。
    【解决方案2】:

    如果您想留在tidyverse 中,也可以使用purrr 包中的map2 执行此操作:

    library(purrr)
    library(dplyr)
    
    map2(dfs, 3:4, ~ .x %>% mutate(z=.y))
    
    [[1]]
      x z
    1 1 3
    
    [[2]]
      y z
    1 2 4
    

    您也可以将列表导入map2

    dfs %>% map2(3:4, ~ .x %>% mutate(z=.y))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多