2017-01-27 16 views
0

で私は、2つのオブジェクトの減算を行う必要があるが、私は私が望む何を期待された結果減算は、単一の要素

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 

行「Negro」にエラーがあります。それは逆転している。

+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

あなたが最初data.tableにあなたの行列をオンにしたい場合にもlapplyを使用することができます
t(t(A)-mx) 
#  Toyota Audi 
#Blanco  -9 0 
#Negro  -10 -6 
#Rojo  0 -4 
3

あなたは、デフォルトでこれは、マージンを越え( "スイープ")の値を減算し、sweepでこれを行うことができます。

ベースR、使用、 apply代わり colMaxsのと完全に
sweep(A, 2, colMaxs(A)) 
     Toyota Audi 
Blanco  -9 0 
Negro  -10 -6 
Rojo  0 -4 

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

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

すべての列を使用している場合は、 '.SDcols = colnames(dt)'は必要ありません –

関連する問題