使用 map2() 生成具有不同列名的小标题
Generate tibbles with different column names with map2()
我有一个名称字符向量和一个数值向量列表。我想用一列创建 tibbles,其中列名来自字符向量,应该用数字向量中的值填充。
这是我尝试过的一个最小示例:
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
而不是 col1
或 col2
。通过使用 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
也许我们需要set_names
map2(names, cols, ~ tibble(.y) %>%
set_names(.x))
map2()
是常规函数,因此不支持 !!
。因为这里引用的是 tibble()
,所以你应该取消引用:
map2(names, cols, function(n, x) tibble::tibble(!!n := x))
请注意,您不需要 sym()
在 LHS 上取消引用名称,因为符号和字符串都受支持(这是 R 中的标准,您始终可以提供字符串或符号形式的名称,例如 list("str" = 1, sym = 2)
).
我有一个名称字符向量和一个数值向量列表。我想用一列创建 tibbles,其中列名来自字符向量,应该用数字向量中的值填充。
这是我尝试过的一个最小示例:
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
而不是 col1
或 col2
。通过使用 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
也许我们需要set_names
map2(names, cols, ~ tibble(.y) %>%
set_names(.x))
map2()
是常规函数,因此不支持 !!
。因为这里引用的是 tibble()
,所以你应该取消引用:
map2(names, cols, function(n, x) tibble::tibble(!!n := x))
请注意,您不需要 sym()
在 LHS 上取消引用名称,因为符号和字符串都受支持(这是 R 中的标准,您始终可以提供字符串或符号形式的名称,例如 list("str" = 1, sym = 2)
).