这是我实际数据集的一小部分。
1 2 3 4 5
57.033 57.0332 57.0333 57.0339 57.03332
57.033 57.033 57.0335 59.0490 59.04901
59.0489 59.048 59.0490589 60.0806 60.08
60.0805 60 60.08 60 60.08059
60.08053 60.080 60.08 61.0366 61.03947
相同结构的第二个矩阵。
mz2
1 2 3 4 5
17.26 16.95225 17 17.84 17.79
14 141 143 632 629
630 63 631.337 241.5272 239
539 41 413 412 412
41 240 241 640 56
我需要将 col 1 中的第一个值与所有列中的所有值进行比较,如果它们符合我的标准,我应该在该特定列的第一行中添加值。这将在迭代中发生。然后,我检查 col 1 中的第二行并匹配所有列中的所有值,如果它们符合条件,则将它们添加到特定列的第 2 行。
我尝试使用 for 循环,但它很混乱。
这是我的尝试:
x.mz1<-matrix(0,5,5)
b1.mz=mz[,1] ##mz is my sample data above
b2.mz=mz2[,1]
for (i in length(b1.mz))
{
one.mz=b1.mz[i]
one.2=b2.mz[i]
for (j in 2:ncol(mz))
{
two.1=mz[,j]
two=mz2[,j]
for (k in 1:length(two.1))
{
sec.mz=two.1[k]
sec=two[k]
cond1[k]<-one.mz-two.1<0.000005
cond2[k]<-one.2-two<10
cond.check<-cbind(cond1[k],cond2[k])
cond.chc<-rbind(cond.check)
browser()
}
cond.chk.sum<-apply(cond.chc,1,sum)
sum.check<-sum(cond.chk.sum==2,na.rm=T)
if (sum.check==1)
{
x.mz1[i,j]=sec.mz
}
我在我的代码中尝试了什么:我尝试从所有迭代中生成一个逻辑矩阵,并且在为标准检查了 col 2 中的所有行之后,将有一个逻辑矩阵,并且当生成矩阵时,它的大小将是 5x2两种条件。然后,当两个条件都为 TRUE 时,如果我比较 col 1 中的第一个值,我将 col 2 值添加到第 1 行。
我希望很清楚,因为在尝试了所有循环结构之后我很困惑。有没有更简单的方法可以在不使用这么多循环的情况下做到这一点?使用 lappy 或其他一些功能。
输出:不是确切的值,而是给出我期望的输出的想法。
1 2 3 4 5
57.03326875 57.03329 0 57.033 57
57.03329688 0 0 0 59.049
59.04894556 60.0805 59.049 60 0
60.0805355 0 0 60.080 60.080
60.08053673 61.039281 0 60.09 61.0839
第一个 col 是我在主矩阵中的 col 1 并且计算所有其他列。如果我从所有匹配的行中找到一个值,那么我将它添加到该值所属的行和相应的列中。0 表示在该列的所有行中没有与第 1 列中的该值匹配的值。