r - 使用列名删除 R 矩阵中的列 - 与顺序无关
问题描述
我无法使用列名删除矩阵中的列 - 输出取决于列名的顺序。
matrix <- matrix(c(1,2,3,4,5,6,7,8,9,10,11,12), 3,4,dimnames = list(c("R1","R2","R3"), c("C1","C2","C3","C4")))
setA <- c("C2","C3")
setB <- c("C3","C2")
matrixA <- matrix[, colnames(matrix)!=setA]
matrixB <- matrix[, colnames(matrix)!=setB]
我期望两种情况下的输出相同(预期输出是矩阵B的输出)
但是,我得到的实际输出是:
> matrixA
C1 C2 C3 C4
R1 1 4 7 10
R2 2 5 8 11
R3 3 6 9 12
> matrixB
C1 C4
R1 1 10
R2 2 11
R3 3 12
在我的实际问题中,我将不得不以随机顺序选择 setA 的元素。我如何确保实际删除了这些列?
解决方案
那是因为 和 的元素setA
被setB
回收到与 具有相同的长度colnames(matrix)
。
setA
c("C2", "C3", "C2", "C3")
使用时会变成colnames(matrix)!=setA
. 同样,在 中使用时setB
将变为。这就是为什么选择所有列,而只选择 2 列的原因。c("C3", "C2", "C3", "C2")
colnames(matrix)!=setB
setA
setB
colnames(matrix)
[1] "C1" "C2" "C3" "C4"
colnames(matrix)!=setA
[1] TRUE TRUE TRUE TRUE
colnames(matrix)!=setB
[1] TRUE FALSE FALSE TRUE
您可以使用以下内容省略不需要的列。
!colnames(matrix) %in% setB
[1] TRUE FALSE FALSE TRUE
推荐阅读
- python-3.x - 将逗号分隔的文件加载到数据框中
- java - notification.setOngoing(true) 在 Android 8.1 中不起作用
- .net-core - 从 NetCoreApp2.1 调用 OData 服务时出现 System.NotSupportedException
- javascript - 在带有点指示器的 js silder 中重置计时器
- vb6 - VB6 更新/重新加载我项目中使用的 CTL 用户控件
- google-cloud-platform - 基于多个云发布/订阅队列自动扩展 GCE 实例组
- javascript - 如何将每个字段名及其各自的值动态添加到一个 json 对象中
- angular - 将 Angular 应用程序部署到 Heroku 时出错
- r - 在 Windows 上运行 R CMD 批处理时忽略 RProfile
- ruby - 创建 SMIME 消息时如何在使用 OpenSSL::PKCS7.sign 签名期间使用 SHA1 摘要