Заменить числовой (0) на na во всех списках в столбце списков в r

У меня есть столбец в фрейме данных, в котором хранятся списки. Вот пример ниже:

           col
1   9
2   8, 8, 8, 5
3   1, 8, 10, 4
4   3, 6, 1, 6
5   9, 9, 10, 4
6   8, 8, 9, 2
7   6, 10, 4, 7
8   6, 1, 5, 9
9   4, 7, 5, 10
10  7, 9, 2, 5

Это код, который я использовал для создания приведенного выше примера:

set.seed(123)
example <- data.frame(matrix(NA_real_, nrow=10, ncol=1))
colnames(example) <- "col"
for(y in 1:10) {
  example$col[y] <- list(c(c(sample(1:10,1)),c(sample(1:10,1)),c(sample(1:10,1)),c(sample(1:10,1))))
}

example$col[1] <- list(c(9))

Я хочу удалить все вхождения числа 9 из всех этих списков в этом столбце моего фрейма данных, чтобы получить что-то вроде этого:

           col
1   NA
2   8, 8, 8, 5
3   1, 8, 10, 4
4   3, 6, 1, 6
5   10, 4
6   8, 8, 2
7   6, 10, 4, 7
8   6, 1, 5
9   4, 7, 5, 10
10  7, 2, 5

вместо этого, который я сейчас получаю с example$col <- lapply(example$col, function(x){ x[x != 9] })

           col
1   numeric(0)
2   8, 8, 8, 5
3   1, 8, 10, 4
4   3, 6, 1, 6
5   10, 4
6   8, 8, 2
7   6, 10, 4, 7
8   6, 1, 5
9   4, 7, 5, 10
10  7, 2, 5

Как я могу заменить numeric(0) на NA_real_ и все еще иметь возможность удалить все девятки?

3
0
306
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Измените оператор lapply следующим образом

lapply(example$col, function(x){ y <- x[x != 9]; if(length(y) < 1) { y <- NA }; y })

Как собственная функция - упрощает внесение изменений в будущем

remove_num <- function(vec, num) {
   x <- vec[vec != num]
   if (length(x) < 1) { x <- NA }
   x
}

lapply(example$col, remove_num, 9)

Вы можете сделать и то, и другое, удалить 9s и, изменить одиночные 9 на NA_real_, за один шаг с помощью оператора if.

example$col <- lapply(example$col, function(x) {
    if(length(x) == 1L && x == 9) NA_real_ else x[x != 9]
})

example
#             col
# 1            NA
# 2      10, 1, 6
# 3   6, 5, 10, 5
# 4       7, 6, 2
# 5   3, 1, 4, 10
# 6      7, 7, 10
# 7    7, 8, 6, 6
# 8  3, 2, 10, 10
# 9    7, 8, 1, 5
# 10   8, 3, 4, 3

Другие вопросы по теме