遍历tibble列时获取map-loop-element的名称

时间:2019-02-25 09:34:02

标签: r dplyr tidyverse purrr

与map循环时,我想提取当前列的列名。例如,如果某些变量,我想取消缩放:

library(tidyverse)
d <- tibble(a = runif(10), b = runif(10), c = runif(10))
l <- list(a = list(min = -19, max = 20), b = list(min = 22, max = 55), c = list(min = 80, max = 120))
restore <- function(x, r) x * (r$max - r$min) + r$min
my_cols <- c("a", "c")
d %>%
  select(!!!my_cols) %>%
  map(~restore(.x, l[[name(.x)]]))
# Error in name(.x) : could not find function "name"

我该如何解决?

1 个答案:

答案 0 :(得分:5)

轻松使用imap中的purrr

请注意,在使用公式快捷方式时,第一个参数是值(.x),第二个参数是位置/名称(.y)。

有关更多详细信息,请参见imap上的帮助页面。但实际上,如果要迭代的对象具有名称,则函数的第二个参数(.y)是名称(否则为位置)。

library(tibble)
library(purrr)
library(dplyr)

d <- tibble(a = runif(10), b = runif(10), c = runif(10))
l <- list(a = list(min = -19, max = 20), b = list(min = 22, max = 55), c = list(min = 80, max = 120))
restore <- function(x, r) x * (r$max - r$min) + r$min
my_cols <- c("a", "c")
d %>%
  select(!!!my_cols) %>%
  imap(~restore(.x, l[[.y]]))