我试图基于正则表达式重命名tibbles
列表中的几列。
让我们看一下以下示例:
library(tidyverse)
df1 <- tibble(
id_site = 1,
country = rep(paste0("country", 1:2), each = 3, len = 5),
species = rep(paste0("sp.", c(1, 3)), each = 3, len = 5),
min = c(100, 900, 2200, 400, 1300)
)
df2 <- tibble(
id_ref = 2,
country = "country3",
species = rep(paste0("sp.", 2:6), each = 1, len = 4),
min_alt = c(2700, 400, 600, 1800)
)
我想在id_site
中将id_ref
重命名为df1
,在min_alt
中将min
重命名为df2
。
我设法使用以下代码一次重命名一列:
list(df1, df2) %>%
set_names("df1", "df2") %>%
map(
~ .x %>%
rename_at(
colnames(.) %>% str_which("alt$"),
~ .x %>% str_replace(".+", "min")
) %>%
rename_at(
colnames(.) %>% str_which("site$"),
~ .x %>% str_replace(".+", "id_ref")
)
)
但是我发现它很重复...
我想知道是否有可能在单个rename_x
函数中一次性完成此操作。
答案 0 :(得分:5)
以下内容的重复性略差:
list(df1, df2) %>%
set_names("df1", "df2") %>%
map(~ .x %>%
rename_at(vars(matches("(alt|site)$")),
str_replace_all, pattern = c("_alt" = "", "site" = "ref")))
答案 1 :(得分:2)
这是一种可能性:
list(df1, df2) %>%
set_names("df1", "df2") %>%
map(~rename_at(.x, vars(matches("^min")), ~"min")) %>%
map(~rename_at(.x, vars(matches("id_site")), ~"id_ref"))