объединить столбцы с одинаковыми именами, взяв минимум их значений - PullRequest
1 голос
/ 10 октября 2019

У меня большая матрица, например:

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)

1 Ответ

2 голосов
/ 10 октября 2019

Вот один из вариантов, где мы split data.frame преобразуем matrix по именам столбцов в list, перебираем list с помощью sapply и получаем min ium каждой строкис pmin

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)

data

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")))
...