элементы из списка списка в R - PullRequest
2 голосов
/ 28 февраля 2020

У меня есть список списка следующим образом:

l = list(list(v = numeric(0), pos = 10), list(v = numeric(0), pos = 10), 
    list(v = numeric(0), pos = 10), list(v = 1.227, pos = 19), 
    list(v = 1.227, pos = 19), list(v = 15.2, pos = 19))

Я хотел бы извлечь элемент v из каждого списка. Я проверил это решение, но у меня оно не работает. Первый метод, использующий функции rapply и unique, будет также включать значения pos, а также я хотел бы сохранить все значения v, даже если они повторяются, или они равны нулю или numeric(0)! Второй метод с:

matrix(unlist(l),ncol=2,byrow=TRUE)

также не работает, потому что у меня есть numeric(0) в моих списках для значения v!

Ответы [ 3 ]

4 голосов
/ 28 февраля 2020

Вы можете попробовать:

sapply(l, `[`, "v")

$v
numeric(0)

$v
numeric(0)

$v
numeric(0)

$v
[1] 1.227

$v
[1] 1.227

$v
[1] 15.2

Или, если вы имеете в виду вектор, содержащий значения из каждого списка:

vec <- sapply(l, `[`, "v")
vec[lengths(vec) == 0] <- NA
unlist(vec)

     v      v      v      v      v      v 
    NA     NA     NA  1.227  1.227 15.200
2 голосов
/ 28 февраля 2020

Другой вариант - использовать варианты purrr::map(), которые имеют аргумент для обработки записей NULL или нулевой длины.

library(purrr)

map_dbl(l, "v", .default = NA)
[1]     NA     NA     NA  1.227  1.227 15.200
1 голос
/ 28 февраля 2020

Вы можете запрограммировать маленький extractR.

extractR <- function(l, v) {
  r <- sapply(l, `[`, "v")
  sapply(r, function(i) ifelse(length(i) == 0, NA, i))
}

extractR(l, "v")
#  v      v      v      v      v      v 
# NA     NA     NA  1.227  1.227 15.200 
...