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")