如何使用 map2 和 rename_with 修改嵌套的列名?

How can I use map2 and rename_with to modify nested column names?

我正在尝试根据未嵌套列的值重命名嵌套数据框中的一组列。这是数据集的简化示例:

library(tidyverse)

df_pre <- tribble(
  ~year, ~data,
  1970, tibble(GEOID_1970 = 1, TOTPOP_1970 = 2),
  1980, tibble(GEOID_1980 = 3, TOTPOP_1980 = 4)
)  

使用 purrr,我想重命名嵌套列,以便我具有以下内容:

df_post <- tribble(
  ~year, ~data,
  1970, tibble(GEOID = 1, TOTPOP = 2),
  1980, tibble(GEOID = 3, TOTPOP = 4)
)  

我尝试了多种方法,所有方法都会引发某种错误,例如:

library(purrr)
df_post <- df_pre %>% map2(.x = data, .y = year, 
                           ~ rename_with(str_replace,  
                                        pattern = paste0("_", .y), 
                                        replacement = ""))
#> Error: Can't convert a `tbl_df/tbl/data.frame` object to function

如何使用map2rename_with修改嵌套的列名?除了解决这个特殊问题之外,我还试图更深入地了解如何将诸如年份之类的参数传递给 map2 匿名函数。

我们用 map 遍历 list 列 'data' 并使用 rename_with 选择所有列 (everything()),同时从中删除后缀部分带有 str_remove)

的列名
library(dplyr)
library(purrr)
library(stringr)
df_new <- df_pre  %>%
    mutate(data = map(data, ~ .x %>%
          rename_with(~ str_remove(., "_\d+$"), everything())))

-检查

identical(df_new, df_post)
#[1] TRUE

如果我们想使用 'year' 列和 map2

df_new <- df_pre %>%
      mutate(data = map2(data, year, ~  {
              yr <- .y
              .x %>% rename_with(~ str_remove(., str_c("_", yr)), everything())
              }))

-检查

identical(df_new, df_post)
#[1] TRUE