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

时间:2019-09-25 03:22:13

标签: r list matrix na names

我有如下代码:

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列,但将矩阵其余列的列名称保留在列表中?

2 个答案:

答案 0 :(得分:1)

使用:

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

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

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

矩阵与数据框不同。对于矩阵,mat1[1]返回矩阵的第一值,而对于数据帧,mtcars[1]返回矩阵的第一列。要对矩阵中的列进行子集化,您始终需要前面的逗号(mat[, i]而不是mat[i]),但这并不总是适用于数据框。

答案 1 :(得分:1)

我们可以在列名上使用lapplycomplete.cases来返回逻辑向量,并在j索引中使用该逻辑向量来选择矩阵的列

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

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