【问题标题】:Extracting matrix rows conditional on their rowsum?以行和为条件提取矩阵行?
【发布时间】:2011-03-21 13:54:09
【问题描述】:

在矩阵中,如何确定具有最大rowsums 的行。例如,在以下矩阵中:

     -  A  P  S  T
  -  1  0  0  0  0
  A  0  0  0  0  1
  C  0  0  0  1  0
  P  0  2  0  2  0
  S  0  0  0 23  3
  T  0  0  1  0  0

行标普有两个最大的rowsums

【问题讨论】:

  • 你应该重新格式化你的矩阵,它的格式现在很难理解......

标签: r matrix


【解决方案1】:

没有必要使用名称,您可以轻松做到:

> Rsum <- rowSums(mat)
>  mat[tail(order(Rsum),2),]
  - A P  S T
P 0 2 0  2 0
S 0 0 0 23 3

【讨论】:

  • 如果不止一行具有相同(获胜)分数,那么您将获得超过 2 个结果行。但我猜我的方法是用名字,你会失去一个随机的获胜行,所以这取决于用例。
  • 真的很好 (+1),我不知道 tail 但在这个例子中看起来真的很有用。在你们都给出了这么好的答案之后,我很快将不得不删除我的,以免看起来太蹩脚! :)
  • @tim:是的。我调整了,我什至可以简化我的解决方案。这个总是给出 2 行。谢谢指针。
【解决方案2】:

你可以这样做:

# Build your example matrix
mat = matrix( data=c( 1,0,0,0,0, 0,0,0,0,1, 0,0,0,1,0, 0,2,0,2,0, 0,0,0,23,3, 0,0,1,0,0 ), ncol=5, byrow=T )
rownames( mat ) = c( '-', 'A', 'C', 'P', 'S', 'T' )
colnames( mat ) = c( '-', 'A', 'P', 'S', 'T' )

# Get the sums
sums = rowSums( mat )

# Get the top 2 row names
top.names = names( sums[ order( sums, decreasing=TRUE ) ][ 1:2 ] )

# Filter the original matrix to include just these two
mat[ rownames( mat ) %in% top.names, ]

哪些输出

  - A P  S T
P 0 2 0  2 0
S 0 0 0 23 3

【讨论】:

  • +1 让您以更智能的方式排序和选择前两个元素,而不是我的方式 :)
【解决方案3】:

以易于复制的格式粘贴您的矩阵,以便其他人检查您的问题:

m <- structure(list(X. = c(1L, 0L, 0L, 0L, 0L, 0L), A = c(0L, 0L, 
0L, 2L, 0L, 0L), P = c(0L, 0L, 0L, 0L, 0L, 1L), S = c(0L, 0L, 
1L, 2L, 23L, 0L), T = c(0L, 1L, 0L, 0L, 3L, 0L)), .Names = c("X.", 
"A", "P", "S", "T"), class = "data.frame", row.names = c("-", 
"A", "C", "P", "S", "T"))

您可以使用dput 获取它,例如:dput(YourMatrix)。这可能对您未来的问题有用:)

回到问题 - 对rowSums 进行排序并通过以下方式获取名称:

t <- names(sort(rowSums(m)))

获取前两个:

> t[(length(t)-1):length(t)]
[1] "T" "S"

或者通过以下方式获取想要的行:

> d[t[(length(t)-1):length(t)],]
  T  S
- 0  0
A 1  0
C 0  1
P 0  2
S 3 23
T 0  0

【讨论】:

  • @Ram:刚刚意识到,您需要行总和。只需将上述代码中的colSums 替换为rowSums 即可。
  • 并将逗号放在条件后面而不是最后一行的前面。
猜你喜欢
  • 2020-02-11
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 2011-10-02
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多