将包含数据框名称的列添加到数据框列表中

时间:2014-12-02 20:41:28

标签: r

如果我有数据框列表

my_list = list(data, data2, data3)

我想为每个填充了该数据框名称

的列添加一列
column1    column2    new_column    
12         27         data
27         987        data
378        1234       data

,我该怎么做?我希望集合中的所有DF都保留其原始名称,但也要填充一列。

我试过了:

my_list = lapply(my_list, function(DF){
     DF$new_column <- DF

     DF
})

但它不会在函数中的列表中运行。

我错过了什么?感谢

3 个答案:

答案 0 :(得分:11)

您的列表未命名。您可以在创建时手动命名

my_list = list(data = data, data2 = data2, data3 = data3)

或者您可以使用mget&amp;如果您有许多数据集,则ls组合

my_list <- mget(ls(pattern = "^data$|^data\\d+$"))

后记,只需使用Map

即可
my_list <- Map(cbind, my_list, new_clumn = names(my_list))
my_list
# $data
#   column1 column2 new_clumn
# 1      12      27      data
# 2      27     987      data
# 3     378    1234      data
# 
# $data2
#   column1 column2 new_clumn
# 1      12      27     data2
# 2      27     987     data2
# 3     378    1234     data2
# 
# $data3
#   column1 column2 new_clumn
# 1      12      27     data3
# 2      27     987     data3
# 3     378    1234     data3

#If you want to put the data sets back to the global environment you can use `list2env`
#list2env(my_list, .GlobalEnv) 
#Please Note that it is usually not the preffered practice to move data frames to the global environment and back. It is preferred to store all you data sets in list from the very beginning and manipulating them within the list using functions such as `Map`, `lapply`, etc.

答案 1 :(得分:0)

> x <- data.frame(1:2, 2:1)
> my_list <- list(a = x, b = x)
> my_list
$a
  X1.2 X2.1
1    1    2
2    2    1

$b
  X1.2 X2.1
1    1    2
2    2    1

> your_new_list <- lapply(names(my_list),
+                           function(current_name)
+                               transform(my_list[[current_name]],
+                                         new_column = current_name))
> your_new_list
[[1]]
  X1.2 X2.1 new_column
1    1    2          a
2    2    1          a

[[2]]
  X1.2 X2.1 new_column
1    1    2          b
2    2    1          b

答案 2 :(得分:0)

我改变了,现在看看这是否是你想要的:

names<-names(my_list)
count <- 0
lapply(my_list, function(DF){
    count <<- count+1
    DF[,length(DF)+1] <- names[count]
    names(DF)[length(DF)] <- "new_clumn"
    DF
})