将列值与第一行进行比较,并保留R中的原始值

时间:2018-11-15 20:15:47

标签: r matrix compare

我有一个很大的(当然)光谱数据矩阵,每一列代表一个不同的质量值,而各行代表来自分析的样品。一个小例子...

mydata <- matrix(c(c(1.95,6,1,0),c(1.76,3,2,14),c(3.67,2,1.55,7),c(0.57,3,8,12),c(2.33,3,16,2)),nrow = 4, ncol = 5)
rnames <- c("threshold", "S1", "S2", "S3")
row.names(mydata)<- rnames

#           [,1]  [,2] [,3]  [,4]  [,5]
# threshold 1.95  1.76 3.67  0.57  2.33
# S1        6.00  3.00 2.00  3.00  3.00
# S2        1.00  2.00 1.55  8.00 16.00
# S3        0.00 14.00 7.00 12.00  2.00

第一行代表阈值,要考虑的是,样本值必须是阈值的3倍。我想将第一行的值与该列中后续行中的所有值进行比较,如果它等于或大于第一行的值的3倍,则返回该单元格的值,否则将其替换为“ 0”。

因此,对于那些小的样本数据,我希望实现的输出矩阵如下所示:

mydata2 <- matrix(c(c(1.95,6,0,0),c(1.76,0,0,14),c(3.67,0,0,0),c(0.57,3,8,12),c(2.33,0,16,0)),nrow = 4, ncol = 5)
row.names(mydata2) <- rnames

#           [,1]  [,2] [,3]  [,4]  [,5]
# threshold 1.95  1.76 3.67  0.57  2.33
# S1        6.00  0.00 0.00  3.00  0.00
# S2        0.00  0.00 0.00  8.00 16.00
# S3        0.00 14.00 0.00 12.00  0.00

我正在考虑有一种方法可以使用apply来执行此操作,但是我对R的了解还没有扩展到这一程度。

我应该注意,阈值(第一)行最初是一个单独的1xn矩阵,使用InsertRow将其插入第一行。如果将数据矩阵与“阈值”矩阵进行比较而不是比较矩阵内的行,则更好。

感谢您在解决此问题方面的帮助!

4 个答案:

答案 0 :(得分:2)

您可以将矩阵的第一行重复到与其余行相同的大小。然后进行比较,得到一个布尔矩阵。将此乘以原始值。

curpsinfo

如果您的阈值存储在单独的矩阵中,则可以使用相同的原理。

答案 1 :(得分:1)

sweep是为此而准备的,并且很快:

mydata[-1,][sweep(mydata[-1,], 2, mydata[1,], FUN=`/`) < 3] <- 0
mydata

#          [,1]  [,2] [,3]  [,4]  [,5]
#threshold 1.95  1.76 3.67  0.57  2.33
#S1        6.00  0.00 0.00  3.00  0.00
#S2        0.00  0.00 0.00  8.00 16.00
#S3        0.00 14.00 0.00 12.00  0.00

答案 2 :(得分:0)

您肯定可以使用apply,而您只需要编写一个函数,就可以将逻辑应用于每一列。

apply(mydata, 2, function(x) c(x[1], x[-1]*(x[-1] >= 3*x[1])))

>           [,1]  [,2] [,3]  [,4]  [,5]
> threshold 1.95  1.76 3.67  0.57  2.33
> S1        6.00  0.00 0.00  3.00  0.00
> S2        0.00  0.00 0.00  8.00 16.00
> S3        0.00 14.00 0.00 12.00  0.00

答案 3 :(得分:0)

上面已经很好地回答了这个问题,但是在将阈值行作为单独的矩阵(或等效向量)的情况下,这是另一种选择。

threshold <- c(1.95, 1.76, 3.67, 0.57, 2.33)   

假设mydata是没有threshold行的原始矩阵:

t(apply(mydata, 1, function(x) ifelse(x < 3*threshold, 0, x)))

#    [,1] [,2] [,3] [,4] [,5]
# S1    6    0    0    3    0
# S2    0    0    0    8   16
# S3    0   14    0   12    0