【问题标题】:Get name of map-loop-element when looping over tibble columns在 tibble 列上循环时获取 map-loop-element 的名称
【发布时间】:2023-03-11 03:51:01
【问题描述】:

我想在循环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"

我该如何解决这个问题?

【问题讨论】:

    标签: r dplyr tidyverse purrr


    【解决方案1】:

    使用来自purrrimap 很容易。

    请注意,使用公式快捷方式时,第一个参数是值 (.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]]))
    

    【讨论】:

    • 您能告诉我,为什么.y 是列名吗? (第一个元素是值,第二个元素是imap的位置,顺序一样就好?)
    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 2017-02-10
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多