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

发布于 2025-01-24 09:06:29 字数 830 浏览 0 评论 0原文

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

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"

我该如何在六个dataframes中的每个范围内依次进行此操作?我尝试过

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

,但

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

我想这是关于骑自行车的名称1?还是如何完成?

感谢您的帮助。

I want to add a prefix to the colnames of dataframes in a list, based on the name of the dataframe:

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]

At this point, i want to change the colnames with something like:

    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"

How can i do this sequentally on each of the six dataframes? I tried

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

but

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

I guess its about cycling through the names of list1? Or how is it done?

Thanks for your help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

萌酱 2025-01-31 09:06:29

使用基本R,您可以使用MAP

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

这是使用purrr的另一种方式。 i函数(例如,imap,imodify)将在as parameter .y中传递列表项目的名称,以及.x 。

library(purrr)

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

Using base R, you can use Map.

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

Here is another way using purrr. The i functions (e.g., imap, imodify) will pass the name of the list item in as parameter .y along with the list contents in .x.

library(purrr)

imodify(list1, ~ set_names(.x, paste(names(.x), .y, sep = ".")))
死开点丶别碍眼 2025-01-31 09:06:29

另一种方式,如果您已经准备好数据框,并且想在每个数据框的名称之前将列前缀:

## 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)
})

another way, if you have your dataframes already prepared and want to prefix columns with each dataframe's name:

## 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)
})

深海蓝天 2025-01-31 09:06:29

修改attr ibutes可能更快。

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

Modifying attributes might be faster.

Map(`attr<-`, list1, 'names', Map(paste, names(list1), lapply(list1, attr, 'names'), sep='.'))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文