Подтвердить что ты не робот

Как напрямую выбрать один и тот же столбец из всех вложенных списков в списке?

Можно ли напрямую выбрать столбец всех вложенных списков в списке?
Мой список создается с помощью aggregate() с таблицей():

AgN=aggregate(data,by=list(d$date),FUN=table,useNA="no")

AgN$x выглядит следующим образом:

$`0`

      1           2           3           9          11 
0.447204969 0.438509317 0.096894410 0.009937888 0.007453416 

$`1`

          1           2           4           8          11 
0.489974937 0.389724311 0.102756892 0.006265664 0.011278195 

…

$n

Я хочу получить вектор определенного столбца для каждой таблицы, например. вектор, содержащий значения всех столбцов с именем "1". Я все еще новичок R, но даже после долгого поиска и поиска не нашел ничего хорошего. Если я хочу получить поле списка, я могу просто индексировать его с помощью скобок, например. [I, J].
В Интернете я нашел несколько примеров для матриц, поэтому я попытался сделать то же самое, сначала выбирая только один столбец с вложенными списками с AgN$x[1][1], но все же выбираем полный список:

$0

     1           2           3           8          11 

0,447204969 0,438509317 0,096894410 0,009937888 0,007453416

Моя следующая попытка была AgN$x[[1]][1], и она работала:

  1 

0.447205

Итак, я попытался сделать то же самое, чтобы выбрать значение каждого первого столбца всех вложенных списков:

AgN$x[[1:length(AgN$x]][1]
Recursive indexing failed at level 2

По-видимому, проблема заключается в том, что запрещено выбирать диапазон, если вы используете двойные скобки.

Моя последняя попытка заключалась в использовании цикла for:

cduR=NULL 
for (i in 1:length(AgN$x)){
t=AgN$x[[i]]
cduR=c(cduR,as.vector(t["1"]))
}

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

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Предполагая, что у вас есть что-то вроде следующего:

myList <- list(`0` = c(`1` = 10, `2` = 20, `3` = 30, `4` = 72),
               `1` = c(`1` = 15, `2` = 9, `3` = 7))
myList
# $`0`
#  1  2  3  4 
# 10 20 30 72 
# 
# $`1`
#  1  2  3 
# 15  9  7 

Используйте sapply() или lapply(), чтобы войти в ваш список и извлечь все нужные столбцы. Некоторые примеры.

# As a list of one-column data.frames
lapply(myList, `[`, 1)
# $`0`
#  1 
# 10 
# 
# $`1`
#  1 
# 15 

# As a list of vectors
lapply(myList, `[[`, 1)
# $`0`
# [1] 10
# 
# $`1`
# [1] 15

# As a named vector
sapply(myList, `[[`, 1)
#  0  1 
# 10 15 

# As an unnamed vector
unname(sapply(myList, `[[`, 1))
# [1] 10 15

Другие варианты синтаксиса, которые также включают вас, включают:

## Same output as above, different syntax
lapply(myList, function(x) x[1])
lapply(myList, function(x) x[[1]])
sapply(myList, function(x) x[[1]])
unname(sapply(myList, function(x) x[[1]]))

Пример вложенного списка

Если у вас есть вложенные списки (списки в списках), попробуйте следующие варианты.

# An example nested list
myNestedList <- list(A = list(`0` = c(`1` = 10, `2` = 20, `3` = 30, `4` = 72),
                              `1` = c(`1` = 15, `2` = 9, `3` = 7)),
                     B = list(`0` = c(A = 11, B = 12, C = 13),
                              `1` = c(X = 14, Y = 15, Z = 16)))

# Run the following and see what you come up with....
lapply(unlist(myNestedList, recursive = FALSE), `[`, 1)
lapply(unlist(myNestedList, recursive = FALSE), `[[`, 1)
sapply(unlist(myNestedList, recursive = FALSE), `[[`, 1)
rapply(myNestedList, f=`[[`, ...=1, how="unlist")

Обратите внимание, что для lapply() и sapply() вам нужно использовать unlist(..., recursive = FALSE), а для rapply() (рекурсивное применение) вы напрямую ссылаетесь на список.