R 如何使用map2和重命名_来修改嵌套的列名?

R 如何使用map2和重命名_来修改嵌套的列名?,r,dplyr,purrr,R,Dplyr,Purrr,我正在尝试根据未列出列的值重命名嵌套数据帧中的一组列。以下是数据集的简化示例: library(tidyverse) df_pre <- tribble( ~year, ~data, 1970, tibble(GEOID_1970 = 1, TOTPOP_1970 = 2), 1980, tibble(GEOID_1980 = 3, TOTPOP_1980 = 4) ) 我尝试过多种方法,所有这些方法都会产生某种错误,例如: library(purrr) df_post

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

library(tidyverse)

df_pre <- tribble(
  ~year, ~data,
  1970, tibble(GEOID_1970 = 1, TOTPOP_1970 = 2),
  1980, tibble(GEOID_1980 = 3, TOTPOP_1980 = 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
库(purrr)
df_后%map2(.x=数据,.y=年份,
~将_重命名为(str_替换,
模式=粘贴0(“”,.y),
替换=”))
#>错误:无法将`tbl\u df/tbl/data.frame`对象转换为函数

如何使用
map2
plus
rename\u with
修改嵌套的列名?除了解决这个特殊问题之外,我还试图获得更多关于如何将参数(如year)传递给
map2
匿名函数的见解。

我们使用
map
循环
列表
列“数据”,并使用
重命名
选择所有列(
一切()
)使用
str\u remove
从列名中删除后缀部分时


如果我们想使用带有
map2的'year'列

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

@nicholas它已经更新了很多了Hanks。我试图理解在匿名函数中需要赋值.y的一般原理。你能提供一些额外的见解吗?@nicholas在你的代码中,列被拉到了
mutate/summary
之外,因此你可能需要
dfu pre%>%{map2(.x=.$data,.y=.$year,~.x)}
这个代码(
df_pre%>%{map2(.x=.$data,.y=.$year,~.x)}
)创建一个两个tibble的列表。我不明白它是如何解决我关于作业的问题的。任何洞察都将不胜感激。@nicholas我只是想说明您的代码在开始时哪里不正确,因为它不能与map2(data,year)一起工作,因为这些对象是data.frame中的列
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
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