在 r 中的一列列表中的所有列表中用 NA 替换 numeric(0)

Replace numeric(0) with NAs in all lists in a column of lists in 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_ 并且仍然能够删除所有的 9?

像这样修改您的 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 将单个 9s 更改为 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