2017-01-27 27 views
0

我需要做的兩個對象的減法,但我沒有得到期望的結果減法逐列的,由單一元素

library(matrixStats) 
A<-matrix(c(5, 7, 4, 1, 14, 3), nrow=3, ncol=2, byrow=T, 
     dimnames=list(c("Blanco", "Negro", "Rojo"), c("Toyota", "Audi"))) 

> A 
     Toyota Audi 
Blanco  5 7 
Negro  4 1 
Rojo  14 3 

mx <- colMaxs(A) 

> mx 
[1] 14 7 

A-mx 

      Toyota Audi 
Blanco  -9 0 
Negro  -3 -13 
Rojo  0 -4 

我想的是,最大數目被消減其相應的列,如下所示:

  Toyota Audi 
Blanco  -9 0 
Negro  -10 -6 
Rojo  0 -4 

行「黑」中的錯誤。它倒過來了。

+0

可能的重複http://stackoverflow.com/questions/24520720/subtract-a-constant-vector-from-each-row-in-a-matrix-in-r或http://stackoverflow.com/questions/ 3643555 /多行矩陣的向量 – akrun

回答

3

你需要做的:

t(t(A)-mx) 
#  Toyota Audi 
#Blanco  -9 0 
#Negro  -10 -6 
#Rojo  0 -4 
3

你可以用sweep做到這一點,它在默認情況下跨保證金減去了( 「掃蕩」)值:

sweep(A, 2, colMaxs(A)) 
     Toyota Audi 
Blanco  -9 0 
Negro  -10 -6 
Rojo  0 -4 

與基礎R,使用, apply代替 colMaxs

完全:

sweep(A, 2, apply(A, 2, max)) 

這可能會慢一點。


替代方案使用rep重複最大值並執行矢量化操作。

A - rep(colMaxs(A), each=nrow(A)) 

A - rep(apply(A, 2, max), each=nrow(A)) 
3
apply(A, 2, function(x) x - max(x)) 
#  Toyota Audi 
#Blanco  -9 0 
#Negro  -10 -6 
#Rojo  0 -4 
1

您還可以,如果你想先打開你的矩陣變成data.table使用lapply:

dt <- as.data.table(A) 
dt[, (colnames(dt)) := lapply(.SD, function(x) x - max(x)), .SDcols=colnames(dt)] 
+0

如果您使用所有列,則不需要'.SDcols = colnames(dt)' –