繁体   English   中英

根据条件在迭代中将一个值与数据框中的所有值进行匹配

[英]Matching one value against all values in a dataframe, in iteration based on criteria

这是我实际数据集的一小部分。

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中的第一个值与所有列中的所有值进行比较,如果它们符合我的标准,则应在该特定列的第一行中添加该值。 这将在迭代中发生。 然后,我检查列1中的第二行,并与所有列中的所有值匹配,如果它们与标准匹配,则将它们添加到特定列的第二行。

我尝试使用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表示该列中所有行的col 1中的该值没有匹配的值。

更新 :我仅在第一次尝试中检查了下一个列。 我对起始数据进行了小修改并编辑了循环。 参见值1.2。

我不确定我是否完全理解您的要求,但这是一种尝试。

# generate data
  v1 <- c(1.2, 5, 9, 13, 17)
  v2 <- c(1, 1.3, 10, 14, 18)
  v3 <- c(2, 6, 1.4, 15, 1.2)
  v4 <- c(3, 7, 11, 1.5, 1.4)
  v5 <- c(4, 8, 12, 16, 1.5)
  dat <- as.data.frame(cbind(v1, v2, v3, v4, v5))

  dat
      v1   v2   v3   v4   v5
  1  1.2  1.0  2.0  3.0  4.0
  2  5.0  1.3  6.0  7.0  8.0
  3  9.0 10.0  1.4 11.0 12.0
  4 13.0 14.0 15.0  1.5 16.0
  5 17.0 18.0  1.2  1.4  1.5

dat2 <- dat
for (r in 1:nrow(dat)) {                    # loop through rows
  for (v in 1:length(dat)) {                # loop through columns
    v.check <- v + 1
      while (v.check < length(dat)) {
        if (dat[r,v] %in% dat[,v.check]==TRUE) {
          dat2[r,v.check] <- dat[r,v]
          v.check <- v
          break
        } else {
          v.check <- v.check + 1
      }
    }
  }
}   

dat2
    v1   v2   v3  v4   v5
1  1.2  1.0  1.2 3.0  4.0
2  5.0  1.3  6.0 7.0  8.0
3  9.0 10.0  1.4 1.4 12.0
4 13.0 14.0 15.0 1.5 16.0
5 17.0 18.0  1.2 1.4  1.5

数据。

# data 
m1 <- structure(list(X1 = c(57.033, 57.033, 59.0489, 60.0805, 60.08053
), X2 = c(57.0332, 57.033, 59.048, 60, 60.08), X3 = c(57.0333, 
57.0335, 59.0490589, 60.08, 60.08), X4 = c(57.0339, 59.049, 60.0806, 
60, 61.0366), X5 = c(57.03332, 59.04901, 60.08, 60.08059, 61.03947
)), .Names = c("X1", "X2", "X3", "X4", "X5"), class = "data.frame", row.names = c(NA, 
-5L))

m2 <- structure(list(X1 = c(17.26, 14, 630, 539, 41), X2 = c(16.95225, 
141, 63, 41, 240), X3 = c(17, 143, 631.337, 413, 241), X4 = c(17.84, 
632, 241.5272, 412, 640), X5 = c(17.79, 629, 239, 412, 56)), .Names = c("X1", 
"X2", "X3", "X4", "X5"), class = "data.frame", row.names = c(NA, 
-5L))

将条件的结果作为逻辑对象。

# first columns
m1.c1 <- m1[,1]
m2.c1 <- m2[,1]

# first condition
res1 <- lapply(m1.c1,FUN=function(x){x-m1[,-1] < 0.00005})
# second condition
res2 <- lapply(m2.c1,FUN=function(x){x-m2[,-1] < 10})

# getting final condition as logical
res <- lapply(seq_along(m1.c1), FUN=function(x)(res1[[x]] & res2[[x]]))

到目前为止,如何使它陷入困境。

现在, res对象是对您的条件具有逻辑答案的列表。 由于结果描述和提供的数据并不完全一致,因此如何处理结果尚不清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM