首页 > 解决方案 > 删除列表中矩阵的 NA 行

问题描述

我认识到这个问题可能是重复的。

我有一个矩阵列表,对于每个矩阵,我想确定第一列中是否存在 NA。如果存在 NA,我想确定它的位置(行)并删除该行。我想将此操作应用于列表中的所有矩阵。

mat1 <- data.frame(matrix(nrow =2, ncol =2, data = c(NA, 0,0,1)))
mat2 <- data.frame(matrix(nrow =2, ncol =5, data = c(0,0,1,2,1,NA,1,1,1,1)))
mat3 <- data.frame(matrix(nrow =3, ncol =2, data = c(NA, 0,0,1,NA,1)))

list <- list(mat1,mat2,mat3)

lapply(list, function(x) !is.na(x[,1]))

我希望将输出存储在等效列表中(例如 list2)。例如 list2[[1]] 将是一个 1x2 矩阵。list2[[2]] 将是一个 1x5 矩阵。并且列表 2[[3]] 将是一个 1x2 矩阵(仅在第 1 列中保留没有 NA 的行)

标签: rlistmatrixna

解决方案


如果它仅用于第一列,我们遍历listwith lapply,然后使用 an。匿名函数调用x[,1],获取第一列NA(在那is.na!

list2 <- lapply(list, function(x) x[!is.na(x[,1]),, drop = FALSE])

对于 中的整个数据集list,我们可以利用在整个数据集上rowSums创建的逻辑矩阵is.na

lapply(list, function(x) x[rowSums(is.na(x)) == 0,, drop = FALSE])

推荐阅读