我在列表中有 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/