Объединить фреймы данных списка и получить имена фреймов данных в виде столбца

#r #list #rbind

#r #Список #rbind

Вопрос:

Я объединил все фреймы данных из списка всего в один фрейм данных.

Фреймы данных внутри списка вызываются

 TAI
NAM
HEE 
  

и каждый фрейм данных выглядит следующим образом

 Yr-M   Compound1 Compound 2
2015-01   0.002    0.15
2015-02   0.004    0.02
2015-03   0.01     0.09
  

когда я объединяю все фреймы данных с meanall<-do.call(rbind, meaneach) , я получаю

          Yr-M  Compound1  Compound2
TAI.1   2015-01   0.002    0.15
TAI.2   2015-02   0.004    0.02
TAI.3   2015-03   0.01     0.09
  .
  .
  .
NAM.1   2015-01   0.03     0.4
NAM.2   2015-02   0.001    0.005
  

Я хотел бы получить столбец с именами списка, а не в виде имен строк (как указано выше), и без цифр (TAI.1, TAI.2 …), я просто хочу имя TAI

Чтобы я получил это:

  List    Yr-M  Compound1  Compound2
  TAI   2015-01   0.002    0.15
  TAI   2015-02   0.004    0.02
  TAI   2015-03   0.01     0.09
  .
  .
  .
  NAM   2015-01   0.03     0.4
  NAM   2015-02   0.001    0.005
  

Как я могу это сделать?

Комментарии:

1. На мгновение я попытался понять, что mean делает внутри do.call , но я предполагаю, что вы назвали свой список как mean …? Вы можете понять, почему это плохая практика. Что касается имен строк, у вас не может быть дубликатов. Итак, лучшее, что можно сделать, это преобразовать имена строк в столбец, а затем использовать gsub для удаления .[0-9]

2. Я использовал другое имя, но просто изменил его здесь, чтобы избежать недоразумений

Ответ №1:

У вас не может быть дубликатов имен строк. Итак, лучшее, что можно сделать, это преобразовать имена строк в столбец, а затем использовать gsub для удаления .[0-9], т.Е.

 df <- do.call(rbind, your_list)
df$list_id <- gsub('\..*', '', rownames(df))
  

Обратите внимание, что вы можете использовать dplyr или data.table версию rbinding списка, которые имеют возможность включать имена списков в виде столбца, т.Е.

 dplyr::bind_rows(your_list, .id = 'list_id')
data.table::rbindlist(your_list, idcol = 'list_id')
  

Ответ №2:

Вы можете добавить дополнительный столбец с именами списков после объединения трех списков через do.call :

 nameColumn <- data.frame(listName = c(rep(c('TAI','NAM','HEE'),
                                          c(length(TAI),length(NAM),length(HEE) ))
meanall <- cbind(meanall, nameColumn)
  

Если вы хотите, чтобы nameColumn был первым столбцом, просто переключите аргументы в cbind на

 meanall <- cbind(nameColumn, meanall)