使用 lapply 更改列表中数据框的列名

Altering the column names of dataframes in a list with lapply

我想根据数据框的名称向列表中数据框的列名添加前缀:

list1 <- vector("list", 6)

list1 <- lapply(list1, function(x) data.frame(replicate(10,sample(0:1,10,rep=TRUE))))
list1 <- lapply(list1, function(x) {colnames(x)<- letters[1:10];x})
names(list1) <- LETTERS[1:6]

在这一点上,我想用这样的东西来改变colnames:

    colnames(list1[[1]]) <- paste(names(list1[1]), colnames(list1[[1]]), sep=".")
    colnames(list1[[1]])
    [1] "A.a" "A.b" "A.c" "A.d" "A.e" "A.f" "A.g" "A.h" "A.i" "A.j"

我如何在六个数据帧中的每一个上依次执行此操作?我试过了

lapply(list1, function(x) {colnames(list1[x]) <- paste(names(list1[x]), colnames(list1[[x]]), sep=".");x })

但是

Error in list1[x] : invalid subscript type 'list'

我猜是关于循环遍历 list1 的名称?或者是怎么做到的?

感谢您的帮助。

使用base R,你可以使用Map.

Map(function(x, y) setNames(x, paste(names(x), y, sep = ".")), list1, names(list1))

这是使用 purrr 的另一种方法。 i 函数(例如 imap、imodify)将作为参数 .y 传递列表项的名称以及 .x.

中的列表内容
library(purrr)

imodify(list1, ~ set_names(.x, paste(names(.x), .y, sep = ".")))

另一种方式,如果您已经准备好数据框并希望在列前加上每个数据框的名称:

## example dataframes
df1 <- data.frame(col1 = runif(1))
df2 <- data.frame(col1 = runif(1))
library(purrr)

dataframes_to_change = c('df1','df2')

walk(dataframes_to_change, ~{
    df <- get(.x)
    names(df) <- paste(.x, names(df), sep = '_')
    assign(.x, value = df, pos = 1)
})

修改 attributes 可能会更快。

Map(`attr<-`, list1, 'names', Map(paste, names(list1), lapply(list1, attr, 'names'), sep='.'))