我有如下代码:
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
列,但将矩阵其余列的列名称保留在列表中?
答案 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)
我们可以在列名上使用lapply
和complete.cases
来返回逻辑向量,并在j
索引中使用该逻辑向量来选择矩阵的列
lapply(mylist, function(x) x[, complete.cases(colnames(x)), drop = FALSE])
#[[1]]
# Name1
#[1,] 1
#[[2]]
# Name1
#[1,] 1