У меня есть список фреймов данных, которые я в конечном итоге хочу объединить, сохраняя при этом запись их исходного имени фрейма данных или индекса списка. Это позволит мне подмножество и т. Д. По всем строкам. Для этого я хотел бы добавить новую переменную id в каждый фрейм данных, который содержит имя / индекс фрейма данных, которому он принадлежит.
Изменить: «В моем реальном коде переменные фрейма данных создаются путем чтения нескольких файлов с использованием следующего кода, поэтому у меня нет фактических имен, только те, которые находятся в списке 'files.to.read', которые я не уверен, будут ли они выровнены с порядком фрейма данных:
mylist <- llply(files.to.read, read.csv)
Несколько методов были выделены в нескольких сообщениях: Работа с dataframes-in-a-list-drop-variables-add-new-ones и Использование-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) в первом примере.
Любые идеи или лучший способ справиться со всем «слиянием с исходным идентификатором»
Изменить - добавленное решение ниже: я реализовал решение, используя предложение Хэдли и подталкивание Томми, которое выглядит примерно так.
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)
Спасибо всем.