Доступ к векторам в списке с массивом индексов в R - PullRequest
1 голос
/ 24 января 2020

У меня есть список, содержащий 3 вектора, например:

> test_list
[[1]]
[1] "a" "b"

[[2]]
[1] "c" "d" "e"

[[3]]
[1] "f" "g"

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

> indices
     [,1] [,2] [,3]
[1,]    1    3    2
[2,]    2    2    2

This желаемый результат:

     [,1] [,2] [,3]
[1,] "a"  "e"  "g"
[2,] "b"  "d"  "g"

Я нашел следующий способ сделать это:

test_list <- list(c("a", "b"), c("c", "d", "e"), c("f", "g"))
indices <- matrix(c(1, 3, 2, 2, 2, 2), nrow = 2, ncol = 3, byrow = TRUE)
t(apply(indices, 1, function(row){mapply(`[[`, test_list, row)}))

Есть ли более чистый, более идиоматический c способ?

Ответы [ 2 ]

1 голос
/ 24 января 2020

Один вариант, включающий purrr, может быть:

map2(.x = test_list, 
     .y = asplit(indices, 2),
     ~ .x[.y]) %>%
 transpose()

[[1]]
[1] "a" "e" "g"

[[2]]
[1] "b" "d" "g"

или решением base R с использованием идеи из комментария, предоставленного @nicola:

mapply(`[`, test_list, asplit(indices, 2))
0 голосов
/ 24 января 2020

Другой вариант в base R

out <- do.call(rbind, lapply(test_list, `length<-`, max(lengths(test_list))))   
`dim<-`(out[cbind(c(col(indices)), c(indices))], c(2,  3))
#    [,1] [,2] [,3]
#[1,] "a"  "e"  "g" 
#[2,] "b"  "d"  "g" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...