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
plusrename\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