R использовать mapply во вложенном списке - PullRequest
5 голосов
/ 08 апреля 2020

Используя базу R, я бы хотел использовать функцию mapply во вложенном списке. Например, в приведенном ниже коде я пытаюсь удалить букву «а» из каждого элемента вложенного списка. Я хотел бы заменить последние две строки только одной строкой кода.

mylist <- list(
    list(c("a", "b", "c"), c("d", "e", "f")),
    list(c("a", "v", "w"), c("x", "y"), c("c", "b", "a"))
)

mylist

not_a <- lapply(mylist, lapply, `!=`, "a")

not_a

mylist[[1]] <- mapply(`[`, mylist[[1]], not_a[[1]], SIMPLIFY = FALSE)

mylist[[2]] <- mapply(`[`, mylist[[2]], not_a[[2]], SIMPLIFY = FALSE)

Ответы [ 3 ]

5 голосов
/ 08 апреля 2020

Один из вариантов может быть:

rapply(mylist, how = "replace", function(x) x[x != "a"])

[[1]]
[[1]][[1]]
[1] "b" "c"

[[1]][[2]]
[1] "d" "e" "f"


[[2]]
[[2]][[1]]
[1] "v" "w"

[[2]][[2]]
[1] "x" "y"

[[2]][[3]]
[1] "c" "b"
3 голосов
/ 08 апреля 2020

Или используя map2

library(purrr)
map2(mylist, not_a, ~ map2(.x, .y, `[`))

Или используя map_depth (если ФП заинтересован только в конечном результате)

map_depth(mylist, 2,  ~ .x[.x != 'a'])
#[[1]]
#[[1]][[1]]
#[1] "b" "c"

#[[1]][[2]]
#[1] "d" "e" "f"


#[[2]]
#[[2]][[1]]
#[1] "v" "w"

#[[2]][[2]]
#[1] "x" "y"

#[[2]][[3]]
#[1] "c" "b"

Или более компактно

map_depth(mylist, 2, setdiff, 'a')
2 голосов
/ 08 апреля 2020

Двойной l oop Map/mapply будет делать то, что просит вопрос.

Map(function(i) mapply(`[`, mylist[[i]], not_a[[i]], SIMPLIFY = FALSE), seq_along(mylist))

Проще:

Map(function(x, y) Map(`[`, x, y), mylist, not_a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...