如何使用 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
如何使用map2
加rename_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
我正在尝试根据未嵌套列的值重命名嵌套数据框中的一组列。这是数据集的简化示例:
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
如何使用map2
加rename_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