Выборочное исключение из списка в R - PullRequest
0 голосов
/ 29 января 2019

Мне было интересно, как можно исключить x элементы из второй переменной (в данном случае x[[2]], т. Е. 0:90) в списке x, соответствующий yis 0?

x = list(0:5, 0:90) # from the second variable on, in this list, eliminate elements whose 
                    # corresponding `y` is `0` ?

y = lapply(list(dbinom(x[[1]], 5, .9), dpois(x[[2]], 50)), round, digits = 4)

PS Моя цель, возможно, сделать это, используя lapply для любого большего списка.

1 Ответ

0 голосов
/ 29 января 2019

В этом случае вы можете сделать

x[[2]][y[[2]] != 0]

, чтобы получить ожидаемый результат.

Однако, как уже упоминалось, у вас есть большой список и вы хотите сделать это для каждого из них.В этом случае мы могли бы использовать mapply

mapply(function(p, q) p[q != 0], x[2:length(x)], y[2:length(y)], SIMPLIFY = FALSE)

ИЛИ, если мы хотим использовать lapply, мы могли бы сделать

lapply(2:length(x), function(i) x[[i]][y[[i]] != 0])

Если мы хотим сохранить 1-й элемент какэто мы могли бы сделать

c(list(x[[1]]), lapply(2:length(x), function(i) x[[i]][y[[i]] != 0]))

РЕДАКТИРОВАТЬ

Для поддержания порядка мы можем переставить оба x и y на основе smallest_max

get_new_list <- function(x, y) {
   smallest_max <- which.min(sapply(x, max))
   new_x <- c(x[smallest_max], x[-smallest_max])
   new_y <- c(y[smallest_max], y[-smallest_max])
  c(new_x[1], lapply(2:length(new_x), function(i) new_x[[i]][new_y[[i]] != 0]))
}

x = list(0:5, 0:40)
y = lapply(list(dbinom(x[[1]], 5, .9), dpois(x[[2]], 50)), round, digits = 4)

get_new_list(x, y)
#[[1]]
#[1] 0 1 2 3 4 5

#[[2]]
#[1] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

x = list(0:40, 0:5)
y = lapply(list(dpois(x[[1]], 50), dbinom(x[[2]], 5, .9)), round, digits = 4)

get_new_list(x, y)
#[[1]]
#[1] 0 1 2 3 4 5

#[[2]]
#[1] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
...