r - 与间隔匹配并提取两个矩阵 R 之间的值

标签 r find match intervals

我在列表中有 n 个矩阵和一个附加矩阵,其中包含我想在矩阵列表中找到的值。

要获取矩阵列表,我使用以下代码:

setwd("C:\\~\\Documents\\R") 


import.multiple.txt.files<-function(pattern=".txt",header=T)
{
list.1<-list.files(pattern=".txt")
list.2<-list()
for (i in 1:length(list.1))
{
list.2[[i]]<-read.delim(list.1[i])
}
names(list.2)<-list.1
list.2

}


txt.import.matrix<-cbind(txt.import)

我的列表看起来像这样:(我只展示了一个 n=2 的例子)。每个数组中的行数不同(这里我只取 5 行和 6 行来简化,但我的真实数据中有 500 多行)。

txt.import.matrix[1]

    [[1]]
     X.     RT.     Area.  m.z.      
1     1     1.01   2820.1  358.9777  
2     2     1.03   9571.8  368.4238  
3     3     2.03   6674.0  284.3294  
4     4     2.03   5856.3  922.0094  
5     5     3.03   27814.6 261.1299  


txt.import.matrix[2]

    [[2]]
     X.     RT.     Area.  m.z.      
1     1     1.01    7820.1 358.9777  
2     2     1.06    8271.8 368.4238  
3     3     2.03   12674.0 284.3294  
4     4     2.03    5856.6 922.0096  
5     5     2.03   17814.6 261.1299
6     6     3.65    5546.5 528.6475  

我想在矩阵列表中找到另一个值数组。该数组是通过将列表中的所有数组合并到一个数组中并删除重复项而获得的。

reduced.list.pre.filtering

     RT.   m.z.
1    1.01  358.9777
2    1.07  368.4238
3    2.05  284.3295
4    2.03  922.0092
5    3.03  261.1299
6    3.56  869.4558

我想获得一个新矩阵,其中写入匹配 RT 的 Area. 结果。 ± 0.02m.z. ± 0.0002 对于列表中的所有矩阵。输出可能是这样的。

     RT.   m.z.        Area.[1]      Area.[2]
1    1.01  358.9777    2820.1        7820.1
2    1.07  368.4238                  8271.8      
3    2.05  284.3295    6674.0        12674.0
4    2.03  922.0092    5856.3             
5    3.03  261.1299    27814.6            
6    3.65  528.6475    

我只知道如何只匹配一个数组中的一个精确值。这里的难点是在数组列表中找到值,需要找到值±一个区间。如果您有任何建议,我将不胜感激。

最佳答案

使用 data.table 当前开发版本 v1.9.7 中的 non-equi 连接(参见 installation instructions ),它允许为连接提供非 equi 条件:

require(data.table) # v1.9.7
names(ll) = c("Area1", "Area2")
A = rbindlist(lapply(ll, as.data.table), idcol = "id")           ## (1)

B = as.data.table(mat)
B[, c("RT.minus", "RT.plus") := .(RT.-0.02, RT.+0.02)]
B[, c("m.z.minus", "m.z.plus") := .(m.z.-0.0002, m.z.+0.0002)]   ## (2)

ans = A[B, .(id, X., RT. = i.RT., m.z. = i.m.z., Area.), 
           on = .(RT. >= RT.minus, RT. <= RT.plus, 
                  m.z. >= m.z.minus, m.z. <= m.z.plus)]          ## (3)

dcast(ans, RT. + m.z. ~ id)                                      ## (4)
# or dcast(ans, RT. + m.z. ~ id, fill = 0)
#     RT.     m.z.   Area1   Area2
# 1: 1.01 358.9777  2820.1  7820.1
# 2: 1.07 368.4238      NA  8271.8
# 3: 2.03 922.0092  5856.3      NA
# 4: 2.05 284.3295  6674.0 12674.0
# 5: 3.03 261.1299 27814.6      NA

[1] 命名矩阵列表(此处称为 ll)并使用 lapply() 将它们中的每一个转换为 data.table>,并使用 rbindlist 按行绑定(bind)它们,并将名称添加为额外的列 (idcol)。称它为 A

[2] 将第二个矩阵(此处称为 mat)也转换为 data.table。添加与您要搜索的范围/间隔相对应的其他列(因为我们将在下一步中看到的 on= 参数).称它为 B

[3] 执行条件连接/子集。对于 B 中的每一行,在 A 中找到与提供给 on= 参数的条件对应的匹配行,并提取列 id, X., R.T.和 m.z. 用于那些匹配的行索引。

[4] 最好留在[3]。但是,如果您希望它如您的答案所示,我们可以将其 reshape 为宽格式。 fill = 0 会将结果中的 NA 替换为 0

关于r - 与间隔匹配并提取两个矩阵 R 之间的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38426821/

相关文章:

r - 在 R 中使用 lme4 的重复测量数据的多级模型

r - 从 R 中的数据框创建列表

java - 获取以目标开头的第一个字符串的索引 - 给出错误的输出

ruby - 在 Ruby 中将字符串的部分与数组的元素匹配

C++ 查找字符数组中的最后一个字符

Javascript - 使用匹配来查找两个单词并返回它们之间的所有文本(尽管有换行符)

r - R中有没有一种方法可以根据代表2个不同常量值的两个多边形创建一个新的多边形(代表某个常量值)

正则表达式帮助在 R 中的连字符和空格字符上拆分字符串

matlab - 将查找与结构一起使用

linux - grep 遍历数千个 gz 文件的最快方法?