R повторяющееся подмножество списков, вложенных в несколько списков - PullRequest
1 голос
/ 05 мая 2019

У меня есть набор данных, который был предоставлен мне в форме .xlsx с несколькими рабочими книгами с несколькими листами с одинаковыми именами и похожими столбцами данных на этих листах. Я хочу со временем объединить таблицы данных с одинаковыми именами и провести анализ.

Поскольку в рабочих книгах много лет за несколько лет, я хочу эффективно объединить данные, формат, анализ и т. Д. Я новичок в списках, но успешно прочитал данные, но у меня возникли проблемы с настройкой и связыванием , Я сделал следующие фиктивные данные и скрипт:

#tlm2009
b1<-c('a', 'b', 'c')
b2<-    c(4,    2,  3)
hab<-data.frame(b1,b2)

c1<-c('a', 'b', 'c', 'd')
c2<-    c(1,    2,  3, 4)
raw<-data.frame(c1,c2)

tlm2009<-list(hab,raw)

#tlm2010

b1<-c('a', 'b', 'c','d')
b2<-    c(1,    2,  3, 4)
hab<-data.frame(b1,b2)

c1<-c('a', 'b', 'c', 'd', "e")
c2<-    c(1,    2,  3, 4, 5)
raw<-data.frame(c1,c2)

tlm2010<-list(hab,raw)

my.list<-list(tlm2009,tlm2010)

Затем я запустил следующий код для извлечения 'hab' и или 'raw', но он не работает

library(tidyverse)
unlist(my.list) %>%
    data.frame(val = .) %>%
    filter(str_detect(id, "(hab|raw)"))

и

library(purrr)
map(transpose(my.list),~map_dfc(.x,"hab"))

и получите следующую ошибку для транспонирования:

Ошибка в транспонировании (my.list): элемент 1 ввода списка не является атомным вектором

Так что я хотел бы, чтобы все подмножество «хабов» и присоединились, я еще не рассматривал присоединение, так как не перебрал подмножество. Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 05 мая 2019

Может быть, вы ищете что-то вроде этого

Map(rbind, my.list[[1]], my.list[[2]])

#[[1]]
#  b1 b2
#1  a  4
#2  b  2
#3  c  3
#4  a  1
#5  b  2
#6  c  3
#7  d  4

#[[2]]
#  c1 c2
#1  a  1
#2  b  2
#3  c  3
#4  d  4
#5  a  1
#6  b  2
#7  c  3
#8  d  4
#9  e  5

Это автоматически объединяет ваши наборы данных hab и raw в один список, rbind используя их.

0 голосов
/ 05 мая 2019

Общий вариант - использовать do.call с Map. Это также может занять list с нескольких длин

do.call(Map, c(f = rbind, my.list))
#[[1]]
#  b1 b2
#1  a  4
#2  b  2
#3  c  3
#4  a  1
#5  b  2
#6  c  3
#7  d  4

#[[2]]
#  c1 c2
#1  a  1
#2  b  2
#3  c  3
#4  d  4
#5  a  1
#6  b  2
#7  c  3
#8  d  4
#9  e  5

Или используя tidyverse

library(tidyverse)
pmap(my.list, bind_rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...