我需要减去两个对象,但是我没有得到预期的结果
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 :(得分: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))
答案 1 :(得分:3)
你需要这样做:
t(t(A)-mx)
# Toyota Audi
#Blanco -9 0
#Negro -10 -6
#Rojo 0 -4
答案 2 :(得分:3)
apply(A, 2, function(x) x - max(x))
# Toyota Audi
#Blanco -9 0
#Negro -10 -6
#Rojo 0 -4
答案 3 :(得分:1)
如果您想先将矩阵转换为data.table:
,也可以使用lapplydt <- as.data.table(A)
dt[, (colnames(dt)) := lapply(.SD, function(x) x - max(x)), .SDcols=colnames(dt)]