用r中的列表列中的所有列表中的NA替换数值(0)

时间:2018-08-10 15:27:18

标签: r list dataframe na

我在数据框中有一个存储列表的列。下面是一个示例:

echo

这是我用来生成上述示例的代码:

           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

我想从数据列表中此列的所有这些列表中删除所有出现的数字9,以得到如下内容:

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))

与此相反,我目前正在使用 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),并且仍然能够删除所有9s?

2 个答案:

答案 0 :(得分:3)

您可以同时执行以下操作,删除9s ,并用NA_real_语句一步将单个9s更改为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

答案 1 :(得分:0)

像这样修改您的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)