Создать новый столбец идентификатора во фрейме данных со значениями из имени содержащего вложенного списка - PullRequest
0 голосов
/ 07 декабря 2018

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

parent <- list(
 a = list(
   foo = data.frame(first = c(1, 2, 3), second = c(4, 5, 6)),
 bar = data.frame(first = c(1, 2, 3), second = c(4, 5, 6)),
 puppy = data.frame(first = c(1, 2, 3), second = c(4, 5, 6))),
 b = list(
 foo = data.frame(first = c(1, 2, 3), second = c(4, 5, 6)),
 bar = data.frame(first = c(1, 2, 3), second = c(4, 5, 6)),
 puppy = data.frame(first = c(1, 2, 3), second = c(4, 5, 6)))) 

Следовательно, результат для первого кадра данных в списке a будет выглядеть следующим образом:

 > foo
    first second identifier
 1     1      4          a
 2     2      5          a
 3     3      6          a

Первый кадр данных в списке b будет выглядеть следующим образом:

 >foo   
    first second identifier
 1     1      4          b
 2     2      5          b
 3     3      6          b

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Мы могли бы использовать tidyverse.Цикл по list с imap (дает как values, так и keys (name из list) как .x и .y, затем с map2, loopчерез внутренний list data.frame и mutate, чтобы создать идентификатор столбца в виде .y или names из list

library(tidyverse)
imap(parent, ~ map2(.x, .y, ~ .x %>%
                             mutate(identifier = .y)))
#$a
#$a$foo
#  first second identifier
#1     1      4          a
#2     2      5          a
#3     3      6          a

#$a$bar
#  first second identifier
#1     1      4          a
#2     2      5          a
#3     3      6          a

#$a$puppy
#  first second identifier
#1     1      4          a
#2     2      5          a
#3     3      6          a


#$b
#$b$foo
#  first second identifier
#1     1      4          b
#2     2      5          b
#3     3      6          b

#$b$bar
#  first second identifier
#1     1      4          b
#2     2      5          b
#3     3      6          b

#$b$puppy
#  first second identifier
#1     1      4          b
#2     2      5          b
#3     3      6          b

Если мы хотимиметь столбец, основанный на имени data.frame, проходить по элементам list с помощью map, затем использовать imap для циклического прохождения по внутреннему list, чтобы получить key s (namesвнутреннего list) и создайте новый идентификатор столбца

map(parent, ~ imap(.x,  ~ .x %>%
                       mutate(identifier = .y)))
0 голосов
/ 07 декабря 2018

Похоже, что вы можете захотеть что-то вроде этого

Map(function(name, list) {
  lapply(list, function(x) cbind(x, identifier=name))
}, names(parent), parent)

Здесь мы используем Map() и берем список и имена списка и просто cbind эти идентификаторы в data.frames.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...