【问题标题】:Ranking and Counting Matrix Elements in RR中的矩阵元素排序和计数
【发布时间】:2016-07-29 17:17:02
【问题描述】:

我知道有类似的问题,但我找不到我的问题的答案。我正在尝试对矩阵中的元素进行排名,然后提取 5 个最高元素的数据。

这是我的尝试。

set.seed(20)
d<-matrix(rnorm(100),nrow=10,ncol=10)
start<-d[1,1]
for (i in 1:10) {
for (j in 1:10) {
  if (start < d[i,j])
  {high<-d[i,j]
  rowind<-i
  colind<-j
  }
  }
}

虽然这给了我最高元素的数据,包括行号和列号,但我想不出办法对排名从 2 到 5 的元素做同样的事情。我也尝试过

  rank(d, ties.method="max")

但这并没有帮助,因为它只是以矢量格式吐出排名。 我最终想要的是一个包含 秩、列名、行名以及矩阵中最高 5 个元素的数据(个数)。

编辑

set.seed(20)
d<-matrix(rnorm(100),nrow=10,ncol=10)
d[1,2]<-5
d[2,1]<-5 
d[1,3]<-4
d[3,1]<-4

感谢您的回答。这些非常适合我的目的,但是当我为相关图表运行此代码时 - 每对都会有重复的数字 - 我只想计算两个数字中的一个以进行排名。有没有办法做到这一点?谢谢。

【问题讨论】:

  • 是按行还是按列?
  • 请在随机示例之前使用 set.seed。让人们更容易验证和比较答案。
  • @Frank 感谢您的建议。刚刚做出改变。
  • @akrun 我会按列说,但我认为这对我的数据无关紧要,因为我正在处理的原始数据是一个相关表。谢谢。
  • 令人困惑的是,您的问题似乎是针对整个矩阵的。 I'm trying to rank elements in a matrix and then extract data of 5 highest elements.

标签: r sorting matrix rank


【解决方案1】:

这是一个非常粗暴的方法:

DF = data.frame(row = c(row(d)), col = c(col(d)), v = c(d))
DF[order(DF$v, decreasing=TRUE), ][1:5, ]

   row col        v
91   1  10 2.208443
82   2   9 1.921899
3    3   1 1.785465
32   2   4 1.590146
33   3   4 1.556143

最好只进行部分排序,但在?order 中,此选项似乎仅适用于sort,不适用于order


如果矩阵有行名和列名,那么查看它们而不是数字可能更方便。以下是我可能会做的:

dimnames(d) <- list(letters[1:10], letters[1:10])
DF = data.frame(as.table(d))

DF[order(DF$Freq, decreasing=TRUE), ][1:5, ]

   Var1 Var2     Freq
91    a    j 2.208443
82    b    i 1.921899
3     c    a 1.785465
32    b    d 1.590146
33    c    d 1.556143

不幸的是,列名在这里没有多大意义,但您可以像往常一样使用names(DF) &lt;- 更改它们。

【讨论】:

  • 感谢弗兰克的回答。有什么方法可以调用行名和列名而不是数字吗?如果我有 colnames(d)
  • @sh2657 我添加了一种解决方法。如果您有超过两个维度的数组a = array(1:8, c(2,2,2)); data.frame(as.table(a)),这也应该有效。如果为空白,则会自动填充每个暗淡的名称。
  • 完美地达到目的。非常感谢。
【解决方案2】:

这是Matrix的一个选项

library(Matrix)
m1 <- summary(Matrix(d, sparse=TRUE))
head(m1[order(-m1[,3]),],5)
#   i  j        x
#93 3 10 2.359634
#31 1  4 2.234804
#23 3  3 1.980956
#55 5  6 1.801341
#16 6  2 1.678989

或使用melt

library(reshape2)
m2 <- melt(d)
head(m2[order(-m2[,3]), ], 5)

【讨论】:

  • 我猜没有理由将 OP 的示例矩阵存储为稀疏矩阵。
  • @Frank 是为了得到summary
  • 好的,我明白了。以前没有使用过该功能,并认为它与稀疏存储有关,猜测不是。
  • @Frank 如果sparse 被删除,它会折叠到`Length Class Mode 100 dgeMatrix S4`
【解决方案3】:

这是基本 R 中相当简单的东西。

# set.seed(20)
# d <- matrix(rnorm(100), nrow = 10, ncol = 10)

d.rank <- matrix(rank(-d), nrow = 10, ncol = 10)

which(d.rank <= 5, arr.ind=TRUE)
     row col
[1,]   3   1
[2,]   2   4
[3,]   3   4
[4,]   2   9
[5,]   1  10

d[d.rank <= 5]
[1] 1.785465 1.590146 1.556143 1.921899 2.208443

结果可以(很容易)变得更清晰(参见 Frank 的评论):

cbind(which(d.rank <= 5, arr.ind=TRUE), v = d[d.rank <= 5], rank = rank(-d[d.rank <= 5]))

     row col        v rank
[1,]   3   1 1.785465    3
[2,]   2   4 1.590146    4
[3,]   3   4 1.556143    5
[4,]   2   9 1.921899    2
[5,]   1  10 2.208443    1

【讨论】:

  • 也可以cbind(which(d.rank &lt;= 5, arr.ind=TRUE), v = d[d.rank &lt;= 5]) 更清楚地表明您的结果是正确的/与其他答案相匹配。 (但不确定我的cbind 是否确实正确。)
猜你喜欢
  • 1970-01-01
  • 2017-05-24
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多