#r #list #dataframe
Вопрос:
У меня есть список кадров данных. Затем я хочу извлечь имя объекта списка и добавить его в качестве первого столбца в кадре данных. Затем я хочу снять список и создать один фрейм данных, объединяющий каждый фрейм данных по строкам. Все они имеют одинаковые размеры.
Небольшой раздел моего списка кадров данных ниже
mylist <- list(SiO2 = structure(c(5.121, 0.00836394378003293, 0.0199499373432604,
5, 10, 1.87883863763252, 0.0836503954062112, 2.1240292640167), .Dim = c(1L,
8L), .Dimnames = list(NULL, c("Analyte_Mean", "SDBetweenGroup",
"SDWithinGroup", "replicates", "NumSamples", "FValue", "PValue",
"FCritical"))), Al2O3 = structure(c(2.0812, 0.0053103672189408,
0.0159059737205869, 5, 10, 0.442687747035557, 0.903289230024797,
2.1240292640167), .Dim = c(1L, 8L), .Dimnames = list(NULL, c("Analyte_Mean",
"SDBetweenGroup", "SDWithinGroup", "replicates", "NumSamples",
"FValue", "PValue", "FCritical"))))
У меня есть следующее, чтобы получить имя имен объектов списка. Но не уверен, как передать его обратно в виде столбца для каждого кадра данных
names(mylist)
чтобы создать один кадр данных, у меня есть
new_list <- as.data.frame(do.call(rbind, mylist))
Любая помощь приветствуется.
Ответ №1:
Если я вас правильно понял, я бы, наверное, воспользовался purrr
библиотекой. imap_dfr
передаст функции как вашу матрицу, так и ее имя, а затем свяжет результаты в один кадр данных.
library(purrr)
new_list <- imap_dfr(mylist, function(mat, name) {
result <- as.data.frame(mat)
result$name <- name
result
})
дает
> new_list
Analyte_Mean SDBetweenGroup SDWithinGroup replicates NumSamples FValue PValue FCritical name
1 5.1210 0.008363944 0.01994994 5 10 1.8788386 0.0836504 2.124029 SiO2
2 2.0812 0.005310367 0.01590597 5 10 0.4426877 0.9032892 2.124029 Al2O3
Комментарии:
1. спасибо, что ваше решение тоже сработало. Если бы я мог проголосовать за оба решения, я бы проголосовал. Решение Ronak дало немного лучший конечный результат, указав имена в первой колонке.
2. Не беспокойтесь. Хотя нет правила, запрещающего голосовать за несколько ответов. Вы можете принять только один ответ — что вы определенно должны сделать и для ответа Ронака, если он лучше всего подходит для вас, — но голосование и принятие-это две разные вещи. Если только это не дело репутации?
Ответ №2:
Вы можете использовать purrr::map_df
—
purrr::map_df(mylist, data.frame, .id = 'name')
# name Analyte_Mean SDBetweenGroup SDWithinGroup replicates NumSamples
#1 SiO2 5.1210 0.008363944 0.01994994 5 10
#2 Al2O3 2.0812 0.005310367 0.01590597 5 10
# FValue PValue FCritical
#1 1.8788386 0.0836504 2.124029
#2 0.4426877 0.9032892 2.124029
Или в базе R —
do.call(rbind, Map(cbind.data.frame, mylist, name = names(mylist)))
Комментарии:
1. ваше решение purr работало лучше всего, так как оно добавило новый столбец с именами, в то время как базовое решение R создавало имена строк вместо добавления нового столбца
2. @Spooked Посмотрите на последнюю колонку, в конце есть колонка под названием
name
. Здесь также создаются имена строк. Если вы хотитеname
быть первым столбцом, используйтеdo.call(rbind, Map(cbind.data.frame, name = names(mylist), mylist))