将相同的列名称应用于多个小标题

时间:2019-07-03 16:10:55

标签: r purrr

我想使用names函数将相同的列名应用于多个数据框,所有这些数据框均具有相同的列数。我当然可以通过为每个数据帧调用names来以错误的方式执行此操作,但我想正确地做到这一点。设置如下:

library(tidyverse)

df1 <- tibble(1,2,3,4,5)
df2 <- tibble(6,7,8,9,10)
df3 <- tibble(11,12,13,14,15)
df4 <- tibble(16,17,18,19,20)

column_names <- c("Alpha","Bravo","Charlie","Delta","Echo")
tibbles_list <- (c("df1","df2","df3","df4"))

错误的方法当然是:

names(df1) <- column_names
names(df2) <- column_names
names(df3) <- column_names
names(df4) <- column_names

我想以某种方式使用tibbles_list中的数据帧列表(通过as.namerlang::syms或类似方法)将column_names应用于一行中的所有数据帧代码,也许使用了某些purrr的{​​{1}}或基数R中的map函数之一,但是我完全不知道该怎么做。

2 个答案:

答案 0 :(得分:4)

tibbles_list只是对象标识符的vector作为字符串。使用mget,我们可以获取list中对象的值,使用map在列表中循环,然后使用rename_all来更改名称

lst1 <- map(mget(tibbles_list), ~ .x %>%
                   rename_all(~ column_names))
list2env(lst1, .GlobalEnv)

或使用set_names

map(mget(tibbles_list), ~ .x %>% 
            set_names(column_names))

注意:最好将其保留在list中,而不要在全局环境中修改对象

答案 1 :(得分:0)

首先,如果您使用的是数据帧列表,而不是需要退出环境的数据帧名称列表,那么您会好很多了。 。如果您对此事有选择,那就太好了;如果没有,则可以将这些数据帧复制到一个列表中。

帖子How do I make a list of data frames?给出了7个答案,并提供了多种解决方法以及原因,包括有关您是否不愿意从列表开始的方法。

一旦解决,您就可以使用基本setNames(或rlang包装器set_names来设置名称),它本身就不需要names周围的包装。使用purrr映射功能,或将lapply用作基本版本。

library(dplyr)

dfs <- list(df1, df2, df3, df4)
dfs %>%
  purrr::map(~setNames(., column_names))
#> [[1]]
#> # A tibble: 1 x 5
#>   Alpha Bravo Charlie Delta  Echo
#>   <dbl> <dbl>   <dbl> <dbl> <dbl>
#> 1     1     2       3     4     5
##### cutting remaining output

lapply(dfs, function(x) setNames(x, column_names))
# same output as above

由于setNamesnames的包装,所以:

lapply(dfs, function(x) {
  names(x) <- column_names
  x
})
# same output again