使用purrr重命名小标题列表中的不同列

时间:2019-10-29 12:05:19

标签: r list dataframe dplyr purrr

我试图基于正则表达式重命名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函数中一次性完成此操作。

2 个答案:

答案 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"))