通过取最小值合并同名列

merge columns with same name by taking the minimum of their values

我有一个很大的矩阵,像这样:

m:
    0    0    0    60    60  ... (column names) 
 0  2    4    5     9    2
 0  6    8    7     6    4
 0  5    2    6     4    5
 0  3    4    1     3    4
60  4    5    3     1    4
60  4    6    10    2    2
 .
 .
(row names)

我想合并同名列,并找出最小值。最后我想要一个这样的矩阵:

  k:
    0   60  ... (column names) 
 0  2    2
 0  6    4
 0  2    4     
 0  1    3     
60  3    1     
60  4    2    
 .
 .
(row names)

这是一个选项,我们 split data.frame 通过列名将 matrix 转换为 list,通过 list 循环 sapply 并使用 pmin

获取每行的 minium
out <- sapply(split.default(as.data.frame(m), colnames(m)),
         function(x) do.call(pmin, x))
row.names(out) <- row.names(m)
out
#   0 60
#0  2  2
#0  6  4
#0  2  4
#0  1  3
#60 3  1
#60 4  2

或者另一种选择是 tapply

tapply(m, list(row(m), colnames(m)[col(m)]), FUN = min)

数据

m <- structure(c(2, 6, 5, 3, 4, 4, 4, 8, 2, 4, 5, 6, 5, 7, 6, 1, 3, 
10, 9, 6, 4, 3, 1, 2, 2, 4, 5, 4, 4, 2), .Dim = 6:5, .Dimnames = list(
    c("0", "0", "0", "0", "60", "60"), c("0", "0", "0", "60", 
    "60")))