Связывание списков фреймов данных при сохранении индекса - PullRequest
0 голосов
/ 12 января 2019

Существует много сообщений о преобразовании списка фреймов данных в один фрейм данных (, например, здесь ). Тем не менее, мне нужно сделать это, сохраняя информацию из какого списка результирующие строки, то есть мне нужно сохранить индекс исходного списка. Если список безымянный, мне нужен только индексный номер, а если список назван, мне нужно сохранить имя исходного элемента списка. Как я могу это сделать?

С данными, как показано ниже:

foo <- list(data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)), 
            data.frame(x=c('d', 'e', 'f'),y = c(4,5,6)))

Мне нужен такой вывод:

  index x y
1     1 a 1
2     1 b 2
3     1 c 3
4     2 d 4
5     2 e 5
6     2 f 6

в то время как с именованными элементами списка:

foo <- list(df1 = data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)), 
            df2 = data.frame(x=c('d', 'e', 'f'),y = c(4,5,6)))

вывод будет:

  index x y
1   df1 a 1
2   df1 b 2
3   df1 c 3
4   df2 d 4
5   df2 e 5
6   df2 f 6

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Мы можем использовать imap, чтобы получить индекс

library(purrr)
imap_dfr(foo, ~ .x %>% 
              mutate(index = .y))

Или с map

map_dfr(foo, .f = cbind, .id = 'index')
#  index x y
#1     1 a 1
#2     1 b 2
#3     1 c 3
#4     2 d 4
#5     2 e 5
#6     2 f 6

Или используйте Map из base R, где мы перебираем элементы 'foo' и соответствующую последовательность 'foo', cbind, чтобы создать новый столбец, а затем rbind элементы list

do.call(rbind, Map(cbind, index = seq_along(foo), foo))
#  index x y
#1     1 a 1
#2     1 b 2
#3     1 c 3
#4     2 d 4
#5     2 e 5
#6     2 f 6
0 голосов
/ 12 января 2019

Вы можете присвоить списку имя, если оно не названо, и затем выполнить цикл по ним, используя lapply для создания списка фреймов данных и rbind их вместе как один фрейм данных.

names(foo) <- if (is.null(names(foo))) seq_len(length(foo)) else names(foo)

do.call("rbind", lapply(names(foo), function(x) cbind(index = x, foo[[x]])))


#  index x y
#1     1 a 1
#2     1 b 2
#3     1 c 3
#4     2 d 4
#5     2 e 5
#6     2 f 6

Для именованного списка

do.call("rbind", lapply(names(foo), function(x) cbind(index = x, foo[[x]])))

#  index x y
#1   df1 a 1
#2   df1 b 2
#3   df1 c 3
#4   df2 d 4
#5   df2 e 5
#6   df2 f 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...