【问题标题】:Generate tibbles with different column names with map2()使用 map2() 生成具有不同列名的小标题
【发布时间】:2018-04-15 15:56:40
【问题描述】:

我有一个名称字符向量和一个数字向量列表。我想创建一个包含一列的小标题,其中列名来自字符向量,并且应该用数字向量中的值填充。

这是我尝试过的一个最小示例:

names <- c("col1", "col2")

cols <- list(1:10, 11:20)

map2(.x = !!!rlang::syms(names), .y = cols, ~tibble::tibble(.x = .y))

当我运行它时,我得到一个invalid argument type 错误。据我了解(以及我尝试过的),我不能简单地将names 用作.x。那么列名将是.x,而不是col1col2。通过使用syms 并取消引用表达式,我尝试将字符元素从names 转换为我认为需要的名称。

编辑:建议解决方案的基准:

两种建议的解决方案都运行良好且易于阅读。因此,我进行了一个小型基准测试来帮助我选择接受哪种解决方案。使用 !! 的(已接受的)解决方案更快且更短。

Unit: microseconds
      expr      min        lq      mean    median       uq      max neval
 set_names 1148.635 1163.1985 1210.2218 1168.8840 1201.048 3950.820   100
        !!  701.961  713.5295  729.4239  721.2395  734.779 1102.086   100

【问题讨论】:

    标签: r tibble tidyeval


    【解决方案1】:

    map2() 是一个常规函数,因此不支持!!。因为这里引用的是tibble(),所以你应该取消引用:

    map2(names, cols, function(n, x) tibble::tibble(!!n := x))
    

    请注意,您不需要 sym() 在 LHS 上取消引用名称,因为同时支持符号和字符串(这是 R 中的标准,您始终可以将名称作为字符串或符号提供,例如 list("str" = 1, sym = 2))。

    【讨论】:

      【解决方案2】:

      也许我们需要set_names

      map2(names, cols, ~ tibble(.y) %>% 
                              set_names(.x))
      

      【讨论】:

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