我正在尝试提取 purrr::map() 中映射的对象的名称。这是问题的一个简化示例。
library(tidyverse)
input <- list(df1 = mtcars, df2 = iris)
map(input, ~ deparse(substitute(.x)))
Run Code Online (Sandbox Code Playgroud)
我的 SO 搜索让我想到了“deparse(subsitute()”技巧。但在这个例子中,它返回
$df1
[1] "..1"
$df2
[1] "..1"
Run Code Online (Sandbox Code Playgroud)
而不是我想要的,即
df1
[1] "df1"
$df2
[1] "df2"
Run Code Online (Sandbox Code Playgroud)
换句话说,我需要能够在更复杂的 lambda 函数中处理列表中的对象名称。
预先感谢您的任何帮助。
这是数据:
library(tidyverse)
col_pre <- c('a', 'b', 'c')
df <- tibble(a1 = 1:3, a2 = 4:6, b1 = 7:9, b2 = 10:12, c1 = 13:15, c2 = 16:18)
Run Code Online (Sandbox Code Playgroud)
我想使用purrr::map()并dplyr::mutate()创建三个新列,它们是df. 我可以map()用来迭代 a、b、c 列前缀的向量。我想出了这些tidyeval操作,以便下面的代码可以正常运行。
out <- col_pre %>%
map_df(~ df %>%
mutate(!!as.name(paste0(.x, '3')) := !!as.name(paste0(.x, '1')) + !!as.name(paste0(.x, '2')))
)
Run Code Online (Sandbox Code Playgroud)
但是,out现在有六个伪行:
a1 a2 b1 b2 c1 c2 a3 b3 c3
1 1 4 7 10 13 16 5 NA NA
2 …Run Code Online (Sandbox Code Playgroud)