我希望获得每行中前3个最大值并为每个值进行坐标。
假设我有以下矩阵:
[,1] [,2] [,3] [,4] [,5]
[1,] 4 3 6 5 2
[2,] 5 2 1 3 6
取第一行: 我想要:
value coordinate
2 [1,5]
3 [1,2]
4 [1,1]
目前,我能够通过以下方式获得每行中前3个最大值:
# example for first row
a <- m[1,]
a
ndx <- order(a)[1:3]
a[ndx]
但是如何获得相应的坐标?
答案 0 :(得分:2)
我们可以使用apply
和MARGIN=1
来循环遍历行。如果我们想要最小的值,我们可以简单地使用order
(如在OP的帖子中)并选择前3个元素。 order
给出索引,它可用于对元素进行子集化以创建“值”列。要创建坐标,我们获取order
以获取列索引,复制行索引的行,将它们与sprintf
粘贴在一起。使用'value'和'coordinate'创建'data.frame'。
value <- c(apply(m, 1, function(x) x[order(x)[1:3]]))
coordinate <- sprintf('[%d,%d]', rep(1:nrow(m), each=3),
c(apply(m, 1, function(x) order(x)[1:3])))
df1 <- data.frame(value, coordinate, stringsAsFactors=FALSE)
df1
# value coordinate
#1 2 [1,5]
#2 3 [1,2]
#3 4 [1,1]
#4 1 [2,3]
#5 2 [2,2]
#6 3 [2,4]
如果我们想要最大的值,请在上面的代码中使用order(., decreasing=TRUE)
。