Добавление столбца к каждому фрейму данных в списке с именем элемента списка - PullRequest
0 голосов
/ 04 августа 2020

У меня есть список, содержащий несколько фреймов данных, и каждый элемент списка имеет уникальное имя. Структура похожа на эти фиктивные данные

a <- data.frame(z = rnorm(20), y = rnorm(20))
b <- data.frame(z = rnorm(30), y = rnorm(30))
c <- data.frame(z = rnorm(40), y = rnorm(40))
d <- data.frame(z = rnorm(50), y = rnorm(50))

my.list <- list(a,b,c,d)
names(my.list) <- c("a","b","c","d")

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

            z           y group
1   0.6169132  0.09803228     a
2   1.1610584  0.50356131     a
3   0.6399438  0.84810547     a
4   1.0878453  1.00472105     b
5  -0.3137200 -1.20707112     b
6   1.1428834  0.87852556     b
7  -1.0651735 -0.18614224     c
8   1.1629891 -0.30184443     c
9  -0.7980089 -0.35578381     c
10  1.4651651 -0.30586852     d
11  1.1936547  1.98858128     d
12  1.6284174 -0.17042835     d

Моя первая мысль заключалась в том, чтобы использовать mutate для присвоения имени элемента списка столбцу в каждом соответствующем фрейме данных, но оказалось, что при использовании в lapply, names () относится к именам столбцов, а не к именам элементов списка.

test <- lapply(my.list, function(x)  mutate(x, group = names(x)))

   Error: Column `group` must be length 20 (the number of rows) or one, not 2

Какие-либо предложения относительно того, как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 04 августа 2020

нет необходимости изменять только bind с помощью dplyr bind_rows

library(tidyverse)
my.list %>% 
  bind_rows(.id = "groups")

Очевидно, требуется, чтобы список был назван.

0 голосов
/ 04 августа 2020

Мы можем использовать Map из base R

Map(cbind, my.list, group = names(my.list))

Или с imap из purrr

library(dplyr)
library(purrr)
imap(my.list, ~ .x %>% mutate(group = .y))

Или, если намерение состоит в том, чтобы создать единственный data.frame

library(data.table)
rbindlist(my.list. idcol = 'groups')
...