Изменение определенных элементов в подсписке без цикла - PullRequest
0 голосов
/ 23 октября 2018

У меня есть список списка, который я пытаюсь изменить определенным образом.Список списков организован аналогично матрице, но каждый элемент представляет собой числовой вектор.Моя цель - обновить только небольшое количество этих векторов в зависимости от их положения.Например, обновление 4-го элемента в некоторых подсписках.Вот пример того, что я ищу.Для простоты я оставил много пропущенных элементов.

 foo <- list(list(NA, NA, NA, c(2)),
        list(NA, NA, NA, c(1, 5, 9)),
        list(NA, NA, NA, c(1, 5, 9)),
        list(NA, NA, NA, c(7)),
        list(NA, NA, NA, c(5, 8, 9)),
        list(NA, NA, NA, c(1, 8, 9)))

Предположим, я хочу удалить 9 из 4-х элементов подсписка 3-6, соответствующих элементам foo[[4]][[4]], foo[[5]][[4]] и foo[[6]][[4]] Систематически?

Я пытался как-то сделать это, используя lapply, делая что-то вроде этого.

lapply(foo, "[[", 4)[4:6] %>% lapply(function(x) x[!(x %in% 9)])

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

> foo
[[1]]
[[1]][[1]]
[1] NA

[[1]][[2]]
[1] NA

[[1]][[3]]
[1] NA

[[1]][[4]]
[1] 2

[[2]]
[[2]][[1]]
[1] NA

[[2]][[2]]
[1] NA

[[2]][[3]]
[1] NA

[[2]][[4]]
[1] 1 5 9


[[3]]
[[3]][[1]]
[1] NA

[[3]][[2]]
[1] NA

[[3]][[3]]
[1] NA

[[3]][[4]]
[1] 1 5 9


[[4]]
[[4]][[1]]
[1] NA

[[4]][[2]]
[1] NA

[[4]][[3]]
[1] NA

[[4]][[4]]
[1] 7


[[5]]
[[5]][[1]]
[1] NA

[[5]][[2]]
[1] NA

[[5]][[3]]
[1] NA

[[5]][[4]]
[1] 5 8


[[6]]
[[6]][[1]]
[1] NA

[[6]][[2]]
[1] NA

[[6]][[3]]
[1] NA

[[6]][[4]]
[1] 1 8

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете сделать что-то вроде этого

foo[4:6] <- lapply(foo[4:6], function(x) c(x[1:3], list(x[[4]][!(x[[4]] %in% 9)])))


foo[4:6]
#[[1]]
#[[1]][[1]]
#[1] NA

#[[1]][[2]]
#[1] NA

#[[1]][[3]]
#[1] NA

#[[1]][[4]]
#[1] 7

#[[2]]
#[[2]][[1]]
#[1] NA

#[[2]][[2]]
#[1] NA

#[[2]][[3]]
#[1] NA

#[[2]][[4]]
#[1] 5 8
#......

Мы изменяем значения только в списках 4:6, c ombine 1:3 как есть и фильтруем значения из 4-го списка.

...