获取每列中的最大值并打印关联的列和行名称

时间:2018-01-28 16:51:12

标签: r

This post让我开始,但我还没有能够操纵表达式来充分产生所需的输出。作为文件内容的简化版本,让我们说我在R中创建了以下矩阵:

set.seed(14)
B = matrix(sample(1:100, 9),
      nrow=3,
      ncol=3)

colnames(B) <- c("sam1", "sam2", "sam3")
rownames(B) <- c("obs1", "obs2", "obs3")

看起来应该是这样的:

        sam1    sam2    sam3
obs1    26      54      88
obs2    64      95      40 
obs3    94      49      45

我希望能够做的是遍历此矩阵以计算每列中的最大值,然后打印出一个新文件,其中包含值以及行名称和列名称。因此,所需的输出将是一个新的文件结构如下:

sam1    94    obs3
sam2    95    obs2
sam3    88    obs1

如果有帮助,文件本身不必是矩阵。相反,它也可以构造为一个简单的.csv文件,其中obs本身是第一列(而不是rowname),而sam是第一行(少于第一列)的元素。

感谢您的考虑

3 个答案:

答案 0 :(得分:1)

data.frame(w=colnames(B),x=B[cbind(n<-max.col(B),1:ncol(B))],y=rownames(B)[n])
     w  x    y
1 sam1 94 obs3
2 sam2 95 obs2
3 sam3 88 obs1

答案 1 :(得分:1)

@Onyambu打败了我,但这是我使用apply的解决方案:

C <- data.frame(row.names = colnames(B),
                    MaxVal = apply(B, 2, max),
                    WhichMax = apply(B, 2, which.max))
C
     MaxVal WhichMax
sam1     94        3
sam2     95        2
sam3     88        1

答案 2 :(得分:0)

使用data.table,你可以这样做:

TextHighlighter

B喜欢

library(data.table)
B <- setDT(as.data.frame(B))
B[,name := c("obs1", "obs2", "obs3")]

然后你只需融化并取每个变量组的最大值

   sam1 sam2 sam3 name
1:   26   54   88 obs1
2:   64   95   40 obs2
3:   94   49   45 obs3