删除列表中矩阵中的 NA 列会删除矩阵的列名

Removing NA column in matrix in a list deletes column names of the matrix

我的代码如下所示:

mat1 <- matrix(1, nrow = 1, ncol = 2)
mat1[1,1] <- NA
colnames(mat1) <- c(NA, 'Name1')
mat2 <- mat1
mylist <- list(mat1, mat2)

mylist <-  lapply(mylist, function(x)  x[!is.na(colnames(x))])

如果我删除名称为 NA 的列,则列名称 Name1 也会从矩阵中删除。如何删除 NA 列,但保留列表中矩阵剩余列的列名?

使用:

lapply(mylist, function(x)  x[, !is.na(colnames(x)), drop = FALSE])

#   [[1]]
#     Name1
#[1,]     1

#[[2]]
#     Name1
#[1,]     1

矩阵不同于数据帧。在矩阵的情况下,mat1[1] returns 你是矩阵的第一个值,而在数据帧的情况下 mtcars[1] returns 你是第一列。要对矩阵中的列进行子集化,您始终需要在前面加上逗号(mat[, i] 而不是 mat[i]),但对于数据帧而言并非总是如此。

我们可以在列名上使用 lapplycomplete.cases 到 return 逻辑向量,并在 j 索引中使用它到 select 列矩阵

lapply(mylist, function(x) x[, complete.cases(colnames(x)), drop = FALSE])
 #[[1]]
 #     Name1
 #[1,]     1

 #[[2]]
 #    Name1
 #[1,]     1