Извлекать один и тот же элемент из каждого списка в списке в другом списке

#r #list

#r #Список

Вопрос:

У меня есть список (измененный из этого примера, списки подмножеств), который выглядит как

 l3 <- list(item1 = list(item1a = data.frame(matrix(1:9,ncol = 3)),
                        item1b=letters[1:5], 
                        item1c = c(T, F, T, T)), 
           item2 = list(item2a = data.frame(matrix(10:19,ncol = 3)),
                        item2b=letters[1:5], 
                        item2c = c(T, F, T, T)))



l3
$item1
    $item1$item1a
      X1 X2 X3
    1  1  4  7
    2  2  5  8
    3  3  6  9

$item1$item1b
[1] "a" "b" "c" "d" "e"

$item1$item1c
[1]  TRUE FALSE  TRUE  TRUE


$item2
$item2$item2a
  X1 X2 X3
1 10 14 18
2 11 15 19
3 12 16 10
4 13 17 11

$item2$item2b
[1] "a" "b" "c" "d" "e"

$item2$item2c
[1]  TRUE FALSE  TRUE  TRUE
  

Я хотел бы выбрать переменную X1 из каждого наименьшего списка. Это код, который я написал, но я еще не добился успеха.

  l3[[1:2]]["X1"]
[1] NA
  

Приведенный ниже код дает значение X1 только для первого вложенного фрейма данных (это то, что я хочу получить для всех фреймов данных)

 l3[[1]]$item1a$X1 
[1] 1 2 3
  

Любая помощь очень ценится!

Ответ №1:

Может быть, это помогает

 library(purrr)
map(l3, ~ .x[[1]]$X1)
  

Или с помощью pluck с select

 library(dplyr)
map(l3, ~ .x %>% 
            pluck(1) %>% 
            select(X1))
  

Или, если мы не являемся энтузиастами цепочки, то это можно сделать более компактно, как упоминал @ArtemSokolov

 map(l3, pluck, 1, "X1")
  

Или с lapply

 lapply(l3, function(x) x[[1]]$X1)
  

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

1. pluck будет правильно выбирать столбцы фрейма данных, поэтому вы можете просто сделать: map( l3, pluck, 1, "X1" ) . Нет select() необходимости.

Ответ №2:

С plyr :

 plyr::llply(l3,function(x)x[[1]]["X1"])
$item1
  X1
1  1
2  2
3  3

$item2
  X1
1 10
2 11
3 12
4 13
  

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

1. Мне нравится этот код, потому что он сохраняет исходный формат. Спасибо!