Dataframes в списке; добавление новой переменной с именем фрейма данных

У меня есть список фреймов данных, которые я в конечном итоге хочу объединить, сохраняя при этом запись их исходного имени фрейма данных или индекса списка. Это позволит мне подмножество и т. Д. По всем строкам. Для этого я хотел бы добавить новую переменную 'id' в каждый фрейм данных, который содержит имя / индекс фрейма данных, которому он принадлежит.

Изменить: «В моем реальном коде переменные фрейма данных создаются при чтении нескольких файлов. используя следующий код, поэтому у меня нет настоящих имен, только тех, которые находятся в списке 'files.to.read', и я не уверен, будут ли они соответствовать порядку фреймов данных:

mylist <- llply(files.to.read, read.csv)

Несколько методов были выделены в нескольких сообщения: Работа с кадрами данных в списке-перетаскивании-переменных-добавление-новые-они и Использование-lapply-with-change-arguments

Я пробовал два похожих метода, первый из которых использует список индексов:

df1 <- data.frame(x=c(1:5),y=c(11:15))
df2 <- data.frame(x=c(1:5),y=c(11:15))
mylist <- list(df1,df2)

# Adds a new coloumn 'id' with a value of 5 to every row in every dataframe.
# I WANT to change the value based on the list index.
mylist1 <- lapply(mylist, 
    function(x){
        x$id <- 5
        return (x)
    }
)
#Example of what I WANT, instead of '5'.
#> mylist1
#[[1]]
  #x  y id
#1 1 11  1
#2 2 12  1
#3 3 13  1
#4 4 14  1
#5 5 15  1
#
#[[2]]
  #x  y id
#1 1 11  2
#2 2 12  2
#3 3 13  2
#4 4 14  2
#5 5 15  2

Второй пытается передать имена () списка.

# I WANT it to add a new coloumn 'id' with the name of the respective dataframe
# to every row in every dataframe.
mylist2 <- lapply(names(mylist), 
    function(x){
        portfolio.results[[x]]$id <- "dataframe name here"
        return (portfolio.results[[x]])
    }
)
#Example of what I WANT, instead of 'dataframe name here'.
# mylist2
#[[1]]
  #x  y id
#1 1 11  df1
#2 2 12  df1
#3 3 13  df1
#4 4 14  df1
#5 5 15  df1
#
#[[2]]
  #x  y id
#1 1 11  df2
#2 2 12  df2
#3 3 13  df2
#4 4 14  df2
#5 5 15  df2

Но метод функция names () не работает со списком фреймов данных; он возвращает NULL. Могу ли я использовать seq_along (mylist) в первом примере.

Любые идеи или лучший способ справиться со всем «слиянием с исходным идентификатором»

Редактировать - Добавленное решение ниже: Я реализовал решение с использованием Hadleys предложение и толчок Томми, который выглядит примерно так.

files.to.read <- list.files(datafolder, pattern="\\_D.csv$", full.names=FALSE)
mylist <- llply(files.to.read, read.csv)
all <- do.call("rbind", mylist)
all$id <- rep(files.to.read, sapply(mylist, nrow))

Я использовал вектор files.to.read в качестве идентификатора для каждого фрейма данных

Я также отказался от использования merge_recurse (), так как по какой-то причине это было очень медленно.

 all <- merge_recurse(mylist)

Спасибо всем.

15
задан Community 23 May 2017 в 11:52
поделиться