逐列减去单个元素

时间:2017-01-27 18:26:21

标签: r

我需要减去两个对象,但是我没有得到预期的结果

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”行中的错误。它倒了。

4 个答案:

答案 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:

,也可以使用lapply
dt <- as.data.table(A)
dt[, (colnames(dt)) := lapply(.SD, function(x) x - max(x)), .SDcols=colnames(dt)]