Получите имя объекта списка, а затем добавьте это имя в качестве нового столбца каждого списка

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