如何将列表名称添加到df作为数据框的列

时间:2021-08-29 13:13:38

Is there a better way to add names of list fields (data frames in general) as a column of data frame?

有没有更好的方法将列表字段的名称(一般数据帧)添加为数据帧列?

Example data

df1 <- data.frame(x = 1:3, y = 3:5)
df2 <- data.frame(x = 1:3, y = 3:5)
df3 <- data.frame(x = 1:3, y = 3:5)

list = list()
list[["DF1"]] <- df1
list[["DF2"]] <- df2
list[["DF3"]] <- df3

It's working, but I want to avoid for loops when possible.

它工作正常,但我希望尽可能避免循环。

 for (i in 1:length(list)) {
     list[[i]][,"name"] <- names(list[i])
    }

What I'm trying:

我在尝试什么:

lapply(list, FUN = function(df){
  df$anothername <- names(list$df) #This return colnames.
  return(df)
})

Output i want to get:

输出我想得到:

$DF1
  x y name
1 1 3  DF1
2 2 4  DF1
3 3 5  DF1

$DF2
  x y name
1 1 3  DF2
2 2 4  DF2
3 3 5  DF2

$DF3
  x y name
1 1 3  DF3
2 2 4  DF3
3 3 5  DF3

1 个解决方案

#1


5  

We can use Map to cbind each data.frame in the list with the corresponding name of the list.

我们可以使用Map来列出列表中的每个data.frame以及列表的相应名称。

Map(cbind, list, name=names(list))
#$DF1
#  x y name
#1 1 3  DF1
#2 2 4  DF1
#3 3 5  DF1

#$DF2
#  x y name
#1 1 3  DF2
#2 2 4  DF2
#3 3 5  DF2

#$DF3
#  x y name
#1 1 3  DF3
#2 2 4  DF3
#3 3 5  DF3

A better option would be rbindlist to create a single dataset.

更好的选择是rbindlist来创建单个数据集。

library(data.table)
rbindlist(list, idcol="name")

#1


5  

We can use Map to cbind each data.frame in the list with the corresponding name of the list.

我们可以使用Map来列出列表中的每个data.frame以及列表的相应名称。

Map(cbind, list, name=names(list))
#$DF1
#  x y name
#1 1 3  DF1
#2 2 4  DF1
#3 3 5  DF1

#$DF2
#  x y name
#1 1 3  DF2
#2 2 4  DF2
#3 3 5  DF2

#$DF3
#  x y name
#1 1 3  DF3
#2 2 4  DF3
#3 3 5  DF3

A better option would be rbindlist to create a single dataset.

更好的选择是rbindlist来创建单个数据集。

library(data.table)
rbindlist(list, idcol="name")