如何在本示例中使用R进行逻辑表达式的循环和使用

问题描述

我有两个冗长的数据集,其中包含几列和不同的长度,在本示例中,我们将子集分成几行,只有3列:

Temp <- c(12.9423,12.9446,12.9412,12.9617,12.9742,12.9652,12.9463,12.9847,12.9778,12.9589,12.9305,12.9275,12.8569,12.8531,12.9092,12.9471,12.9298,12.9266,12.9374,12.9385,12.9505,12.9510,12.9632,12.9621,12.9571,12.9492,12.8988,12.8895,12.8777,12.8956,12.8748,12.7850,12.7323,12.7546,12.7375,12.7020,12.7172,12.7015,12.6960,12.6944,12.6963,12.6928,12.6930,12.6883,12.6913)

Density <- c(26.38635,26.38531,26.38429,26.38336,26.38268,26.38242,26.38265,26.38343,26.38486,26.38697,26.38945,26.39188,26.39365,26.39424,26.39376,26.39250,26.39084,26.38912,26.38744,26.38587,26.38456,26.38367,26.38341,26.38398,26.38547,26.38793,26.39120,26.39509,26.39955,26.40455,26.41002,26.41578,26.42126,26.42593,26.42968,26.43255,26.43463,26.43603,26.43693,26.43750,26.43787,26.43815,26.43841,26.43871,26.43904)

po4 <-  c(0.4239840,0.4351156,0.4456128,0.4542392,0.4608510,0.4656445,0.4690847,0.4717291,0.4742391,0.4774904,0.4831152,0.4922122,0.5029904,0.5128720,0.5190209,0.5191368,0.5133212,0.5027542,0.4905301,0.4796467,0.4708035,0.4638879,0.4578364,0.4519745,0.4481336,0.4483697,0.4531310,0.4622930,0.4750474,0.4905152,0.5082183,0.5278212,0.5491580,0.5720519,0.5961127,0.6207716,0.6449603,0.6675704,0.6878331,0.7051851,0.7195461,0.7305200,0.7359634,0.7343541,0.7283988)

PP14 <- data.frame(Temp,Density,po4) ##df1

temp <- c(13.13875,13.13477,13.12337,13.10662,13.09798,13.09542,13.08734,13.07616,13.06671,13.05899,13.05890,13.05293,13.03322,13.01515,13.02552,13.01668,12.99829,12.97075,12.95572,12.95045,12.94541,12.94365,12.94609,12.94256,12.93565,12.93258,12.93489,12.93209,12.92219,12.90730,12.90416,12.89974,12.89749,12.89626,12.89395,12.89315,12.89274,12.89276,12.89293,12.89302)

density <- c( 26.35897,26.36274,26.36173,26.36401,26.36507,26.36662,26.36838,26.36996,26.37286,26.37452,26.37402,26.37571,26.37776,26.38008,26.37959,26.38178,26.38642,26.39158,26.39350,26.39467,26.39601,26.39596,26.39517,26.39728,26.39766,26.39774,26.39699,26.40081,26.40328,26.40416,26.40486,26.40513,26.40474,26.40552,26.40584,26.40613,26.40602,26.40595,26.40498)

krho <- c( -9.999999e+06,-1.786843e+00,-9.142976e-01,-9.650734e-01,-2.532397e+00,-3.760537e+00,-2.622484e+00,-1.776506e+00,-2.028391e+00,-2.225910e+00,-3.486826e+00,-2.062341e-01,-3.010643e+00,-3.878437e+00,-3.796426e+00,-3.227138e+00,-3.335446e+00,-3.738037e+00,-4.577778e+00,-3.818099e+00,-3.891467e+00,-4.585045e+00,-3.150283e+00,-4.371089e+00,-3.902601e+00,-4.546019e+00,-3.932538e+00,-4.331247e+00,-4.508137e+00,-4.789201e+00,-4.383820e+00,-4.423486e+00,-4.334641e+00,-4.330544e+00,-4.838604e+00,-4.729123e+00,-4.381797e+00,-4.207365e+00,-4.276804e+00,-4.001305e+00)

MS14 <- data.frame(temp,density,krho) ##df2

所以现在我想遍历两个数据集,并检查MS14 $ density = PP14 $ Density是否为真,那么我想使用该行中的krho列将其乘以与相同的密度,因此该行或范围内的diff(po4)相同。像

#MS14$krho[i] * diff(PP14$po4)[i]

但我跑步时

 PP14$Density == MS14$density 

当然总是FALSE,因为十进制数字很大,没有一个是完全相同的。我通过将数字四舍五入到小数点后第三位来解决该问题,但是这应该是在代码中包含该数字的一种方式,例如,密度为+-0.005。还是将其四舍五入到小数点后三位:

PP14$Density_round2 <- round(PP14$Density,digit=2) 

无论如何,我不确定是否应该使用嵌套循环来检查两列并进行相应的操作,还是最好创建一个与每个data.frame相交的新data.frame:>

common <- intersect(PP14$Density,MS14$density) 

然后进行计算。...(??)

所以我可能需要像这样的嵌套循环:

{for i:PP14
  for j:MS14
 new-> PP14$Density[i] == MS14$density[j]
#if new is true then PP14$krho[i]* MS14$diff(po4)[j]#[for that particular row]
#and print it into a new data.frame df3
#}

因此,请随时提出最好的进行方法。.可能有几种方法来进行..

非常感谢您!

Ps:也欢迎使用Matlab提出建议

解决方法

像这样吗?

compareDec <- function(x,y,digits = NULL,tol = .Machine$double.eps^0.5){
  if(is.null(digits)){
    abs(x - y) < tol
  } else {
    round(x,digits = digits) == round(y,digits = digits)
  }
}

icomp <- outer(MS14$density,PP14$Density,compareDec,digits = 2)
m <- outer(MS14$krho,c(0,diff(PP14$po4)))

new <- which(icomp,arr.ind = TRUE)
df3 <- cbind.data.frame(new,Prod = m[new])

head(df3)
#  row col        Prod
#1  17   1  0.00000000
#2  18   1  0.00000000
#3  19   1  0.00000000
#4  20   1  0.00000000
#5  17   2 -0.03712885
#6  18   2 -0.04161033