r - 将列值与第一行进行比较并保留 R 中的原始值
问题描述
我有一个很大的(当然)光谱数据矩阵,每列代表不同的质量值,而行代表分析中的样本。一个小例子...
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
. 如果将数据矩阵与“阈值”矩阵进行比较会更容易,而不是比较矩阵内的行,那就更好了。
感谢您帮助解决此问题!
解决方案
您可以将矩阵的第一行重复到与其余行相同的大小。然后进行比较,得到一个布尔矩阵。将其与原始值相乘。
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
如果您的阈值存储在单独的矩阵中,则可以使用相同的原理。
推荐阅读
- reactjs - 如何将 React-csv 与最初为空的道具绑定?
- ruby-on-rails - resque-status 与我当前的 resque 版本不兼容
- c++ - 如果每个单词以“a”或“o”开头,如何将其首字母大写?
- r - 在 scatterplot3d 中划分颜色
- django - 哪种Django模型关系合适?
- c# - 调用 Sub Orchestrator 时不要等待 - Azure Durable Functions
- python - Django:管理界面:如何更改用户密码
- r - 如何在 R 中的特定列中添加逗号和百分号
- java - 通过 liquibase 创建数据库结构并从 data-h2.sql 文件中插入模拟数据
- c# - 自定义 RadioButton 框架,里面有文本