Удалите все позиции списков в списке списков после появления первого NA (R) - PullRequest
0 голосов
/ 08 мая 2020

У меня есть вложенный список (или список списков), содержащий все целые числа. Некоторые из вложенных списков имеют NA значения, случайно назначенные из определенной позиции во вложенном списке. Мне нужно удалить все позиции во вложенном списке после появления первого NA.

Например, в моем примере данных ниже списка из 5 вложенных списков, L.miss, позиция L.miss[[2]] - список из девяти векторов целых чисел разной длины. Первый NA появляется в позиции L.miss[[2]][[4]][3], поэтому any(is.na(L.miss[[2]][[4]])) возвращает TRUE. В моем желаемом выводе позиции L.miss[[2]][4:9] необходимо удалить. Список L.want - желаемый результат.

L.miss <- list(list(1,3,c(0,2,0),c(NA)),
             list(1,6,c(0,3,2,0,1,0),c(0,0,NA,1,0,0),1,2,c(NA,1),2,c(0,0)),
             list(1,0),
             list(1,0),
             list(1,4,c(2,0,0,0),c(4,1),c(1,NA,0,0,0),0),
             list(1,0))

L.want <- list(list(1,3,c(0,2,0)),
             list(1,6,c(0,3,2,0,1,0)),
             list(1,0),
             list(1,0),
             list(1,4,c(2,0,0,0),c(4,1),
             list(1,0))

Моя попытка состояла в том, чтобы перебрать позиции списка и присвоить значение NULL:

try <- L.miss 
for (i in 1:length(try)){
  for (k in 1:length(try[[i]])){
    if (any(is.na(try[[i]][[k]]))){
      try[[i]][k:length(try[[i]])] <- NULL
    }
  }
}

Но это возвращает ошибку : Error in try1[[i]][[k]] : subscript out of bounds.

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

Любой совет приветствуется!

1 Ответ

1 голос
/ 08 мая 2020

Вот способ:

out_list <- lapply(L.miss, function(x) {
               inds <- sapply(x, function(x) any(is.na(x)))
               if(any(inds)) x[seq_len(which.max(inds) - 1)] else x
             })

out_list[[2]]
#[[1]]
#[1] 1

#[[2]]
#[1] 6

#[[3]]
#[1] 0 3 2 0 1 0
...