r - 如何从矩阵中删除任何内容?
问题描述
从一个矩阵M
,
> (M <- matrix(1:9, 3, 3))
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
我想按条件删除/保留列并将结果放入列表中。只要条件由不带 的整数组成,就没有问题c(NA, 0)
,例如
cv1 <- 1:3
lapply(cv1, function(x) M[, -x])
对于没有要删除的列的情况,我尝试将NA
或添加0
到条件向量,但它不起作用。
cv2 <- c(NA, 1:3)
cv3 <- 0:3
> lapply(cv2, function(x) M[, -x])[[1]]
[1] NA NA NA
> lapply(cv3, function(x) M[, -x])[[1]]
[1,]
[2,]
[3,]
我知道我能做到
lapply(cv2, function(x) {
if (is.na(x))
M
else
M[, -x]
})
但我想知道是否有更简单的方法。
其实问题:
首先让我印象深刻的是矩阵在以下情况下消失而不是保持完整,尽管我实际上试图删除任何内容:
M[, -(na.omit(NA))]
M[, na.omit(-(NA))]
M[, -0]
M[, -logical(0)]
# [1,]
# [2,]
# [3,]
或者
> M[, -NULL]
Error in -NULL : invalid argument to unary operator
有人可以解释这种行为的原因和优势,和/或如何正确地说吗?
解决方案
原因很简单:减号-x
不被视为特殊的东西,它只是一个常规的数学运算。So-0
与 相同0
,并且-NA
与 相同NA
。
@Cettt 给出了一个答案: setdiff(seq_len(ncol(M)), x)
将给出除x
. 您可以使用逻辑索引执行与seq_len(ncol(M)) != x
if x
is a number 相同的操作,但 if x
is无效NA
。如果您真的也需要处理这种情况,您可以使用is.na(x) | seq_len(ncol(M)) != x
,但@Cettt 的解决方案看起来更简单。
推荐阅读
- c++ - glAttribLocation 返回 -1 即使顶点着色器正在积极使用它
- php - 在单个查询中获取具有 2 个外部表的表的 2 个不同行?
- java - 无法从实例或 bean 中获取 @Value
- ionic-framework - jsPDF未定义离子3
- xpath - Inter findByXpath ignore previous selection
- debugging - 无法在 Gnome shell 中使用 KDevelop 调试 KDevelop
- asp.net-mvc - 在现有 ASP.NET MVC 4.6 Web 项目中实现 Active Directory 登录
- javascript - 是否可以在发送前操作 Ant Design Range Picker 数据?
- r - 在 bgMap 参数中使用 ggmap 绘制 sf 点不起作用
- spring - Spring Boot 和 Keycloak - 仅适用于 get 方法