r - R:通过仅考虑 NA 值的位置来对矩阵行进行分组的快速方法
问题描述
我试图通过它们NA
在每列中的独特位置对矩阵的行进行分组。
例如,使用以下矩阵:
1, 2, NA, 3 NA
2, 5, NA, 4, 5
3, 2, 1, 0, 7
5, 3, NA, 9, 3
0, 2, 1, 4, 6
答案是:
1, 2, 3, 2, 3
表示有 3 个不同的组,即第 2 行和第 4 行在同一组中。
问题是我无法想出一个快速的方法来实现这一点。这是我当前的实现:
mat <- matrix(rnorm(10000*100), ncol=100)
mat[sample(length(mat), nrow(mat))] <- NA
getNAgroups <- function(x) {
allnas <- t(!is.na(x))
nacases <- unique(allnas, MARGIN=2)
groups <- numeric(nrow(x))
for(i in 1:ncol(nacases)) {
groups[colMeans(allnas == nacases[,i]) == 1] <- i
}
groups
}
对于我所想到的目的来说,这有点太慢了:
system.time(getNAgroups(mat))
user system elapsed
7.672 1.686 9.386
解决方案
这是在 NA 位置列表上使用 match 的一种方法:
mat <- matrix(c(1, 2, NA, 3, NA,
2, 5, NA, 4, 5,
3, 2, 1, 0, 7,
5, 3, NA, 9, 3,
0, 2, 1, 4, 6), 5, byrow = TRUE)
categ <- apply(is.na(mat), 1, which)
match(categ, unique(categ))
推荐阅读
- javascript - 如何在 React 中进行嵌套条件渲染?
- django - DigitalOcean App-platform:在非根 URL 上使用 Gunicorn 托管 Dockerized Django 应用程序
- android - 你如何在 Android Studio 中使用 MediaMuxer
- flutter - 从 Flutter Web 显示存储在 Firebase 存储上的图像
- rust - 如何在 Rust 中为泛型实现添加
- firebase - 如何使用 Firebase Firestore 集合上的流来使用 Flutter 按设备半径内的位置显示附近的集合
- javascript - Switch 语句总是在第一个选项上执行
- javascript - 有没有办法将整个音频文件从数据库导入 HTML 并使用所述文件作为
- ios - UITabbleViewCell中的UimageView框架不正确
- snowflake-cloud-data-platform - 从 Snwoflake 表的变量列中获取 xml 元素