在列表中删除带有NA的行

时间:2019-09-05 03:19:33

标签: r list matrix 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的行)

1 个答案:

答案 0 :(得分:2)

如果仅用于第一列,我们将listlapply循环,然后使用an。匿名函数调用,获取第一列(x[,1]),用(NA检查is.na,取反(!),即非_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])