tl;dr在 R 中識別矩陣中相同行組的慣用方法是什么?
給定一個 n×2 矩陣,其中一些行出現不止一次,
> mat <- matrix(c(2,5,5,3,4,6,2,5,4,6,4,6), ncol=2, byrow=T)
> mat
[,1] [,2]
[1,] 2 5
[2,] 5 3
[3,] 4 6
[4,] 2 5
[5,] 4 6
[6,] 4 6
我正在尋找相同行的行索引組。在上面的示例中,行 (1,4) 是相同的,行 (3,5,6) 也是如此。最后是第 (2) 行。我希望得到這些組,以 R 中慣用的任何方式表示。
輸出可能是這樣的,
> groups <- matrix(c(1,1, 2,2, 3,3, 4,1, 5,3, 6,3), ncol=2, byrow=T)
> groups
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 1
[5,] 5 3
[6,] 6 3
其中第一列包含行索引,mat第二列包含每個行索引的組索引。或者它可能是這樣的:
> split(groups[,1], groups[,2])
$`1`
[1] 1 4
$`2`
[1] 2
$`3`
[1] 3 5 6
要么會做。我不確定在 R 中代表組的最佳方式是什么,也歡迎就此提出建議。
出于基準測驗目的,這里有一個更大的資料集:
set.seed(123)
n <- 10000000
mat <- matrix(sample.int(10, 2*n, replace = T), ncol=2)
uj5u.com熱心網友回復:
cbind具有行序列以及行match之間的行和行的unique值
v1 <- paste(mat[,1], mat[,2])
# or if there are more columns
#v1 <- do.call(paste, as.data.frame(mat))
out <- cbind(seq_len(nrow(mat)), match(v1, unique(v1)))
-輸出
> out
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 1
[5,] 5 3
[6,] 6 3
如果我們想要一個list輸出
split(out[,1], out[,2])
-輸出
$`1`
[1] 1 4
$`2`
[1] 2
$`3`
[1] 3 5 6
基準
借助 OP 的大資料
> system.time({
v1 <- paste(mat[,1], mat[,2])
out <- cbind(seq_len(nrow(mat)), match(v1, unique(v1)))
})
user system elapsed
2.603 0.130 2.706
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333085.html
標籤:r
上一篇:RFloop行為
下一篇:為連接變數賦值(在R中)
