我想使用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.name
或rlang::syms
或类似方法)将column_names
应用于一行中的所有数据帧代码,也许使用了某些purrr
的{{1}}或基数R中的map
函数之一,但是我完全不知道该怎么做。
答案 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
由于setNames
是names
的包装,所以:
lapply(dfs, function(x) {
names(x) <- column_names
x
})
# same output again