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

标签 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 倍。我想将第一行值与列中后续行中的所有值进行比较,如果单元格值 =>3x 第一行值,则返回单元格值,否则将单元格替换为“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 将其插入到第一行中。如果将数据矩阵与“阈值”矩阵进行比较,而不是比较矩阵内的行,那就更好了。

感谢您帮助解决此问题!

最佳答案

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

mydata[-1, ] <- mydata[-1, ] * (mydata[-1, ] >= 3 * mydata[rep(1, nrow(mydata) - 1), ])

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

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

关于r - 将列值与第一行进行比较并保留 R 中的原始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53327258/

相关文章:

r - 如何访问分组过滤器操作的组 ID?

r - Shiny:ProgressBar,用于将数据从数据库加载到数据表(DT)

r - 在 R 中索引矩阵的元素

c++ - 如何在字符串C++中使用neighbor_find

java - 在可比数组上找不到符号

r - R核心的 `split`函数背后的算法是什么?

R 使用which()条件获得正确的索引

arrays - 将 bsxfun 或 arrayfun 应用于矩阵的每一行

python - 创建一个带有链接的矩阵

linux - 比较 Linux 中两个目录与​​第三个目录中文件的存在情况