使用map2()生成具有不同列名的元组

时间:2018-04-15 15:56:41

标签: r tibble tidyeval

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

这是我尝试过的最小例子:

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

2 个答案:

答案 0 :(得分:1)

也许我们需要set_names

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

答案 1 :(得分:1)

map2()是常规功能,因此不支持!!。由于这里引用的是tibble(),因此您应该取消引用:

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

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