R中的双索引循环

R中的双索引循环,r,loops,indexing,R,Loops,Indexing,对于编码爱好者来说,这可能是一个不需要动脑筋的问题,但作为这些工具的新手,这已经困扰了我一段时间了 从本质上说,我有一些化学计量学数据,我希望通过样本分析对一系列空白进行调整。所有输出都有时间戳,我想使用样本和下一个空白之间的间隔与两个连续空白之间的间隔的比例,加上最后一个空白值,作为应用校正因子的简单插值的修改器。当样本时间值晚于第二个空白时,我想增加空白对,这样我就根据新的空白对两个时间段之间的样本进行校正。 我的数据集包含一系列元素,元素之间的空白校正不同。 数据集: Blanks

对于编码爱好者来说,这可能是一个不需要动脑筋的问题,但作为这些工具的新手,这已经困扰了我一段时间了

从本质上说,我有一些化学计量学数据,我希望通过样本分析对一系列空白进行调整。所有输出都有时间戳,我想使用样本和下一个空白之间的间隔与两个连续空白之间的间隔的比例,加上最后一个空白值,作为应用校正因子的简单插值的修改器。当样本时间值晚于第二个空白时,我想增加空白对,这样我就根据新的空白对两个时间段之间的样本进行校正。 我的数据集包含一系列元素,元素之间的空白校正不同。 数据集:

Blanks
   Sample           Date/Time Location Li(ppb) Mg(ppb) Ca(ppm) Cr(ppb) Mn(ppb) Co(ppb) Ni(ppb) Cu(ppb) Zn(ppb) Rb(ppb) Sr(ppb) Cd(ppb) Ba(ppb) Ce(ppb) Gd(ppb) Pb(ppb) U(ppb)
1  Blank0 2016-05-23 19:54:33        B   0.000   0.000   0.000   0.000   0.000   0.000   0.000   0.000   0.000   0.000   0.000       0   0.000   0.000       0   0.000  0.000
7  Blank1 2016-05-23 20:35:25        B  -0.069   0.081   0.005  -0.007  -0.001   0.000  -0.007   0.005  -0.004   0.000   0.005       0  -0.003   0.000       0   0.000  0.005
18 Blank2 2016-05-23 21:50:30        B  -0.076   0.743   0.020  -0.005   0.002  -0.001  -0.008   0.002   0.220   0.001   0.042       0   0.008   0.002       0   0.002  0.000
29 Blank3 2016-05-23 23:05:43        B  -0.093  -0.080   0.000  -0.020  -0.001  -0.001  -0.010   0.001  -0.009   0.000  -0.001       0   0.001   0.000       0   0.000  0.000
38 Blank4 2016-05-24 00:07:19        B  -0.096  -0.045   0.000  -0.015   0.000  -0.001  -0.001  -0.002   0.002   0.000  -0.001       0   0.000   0.000       0   0.000  0.000
数据:Mdat_samp

     Sample           Date/Time Location Li(ppb) Mg(ppb) Ca(ppm) Cr(ppb) Mn(ppb) Co(ppb) Ni(ppb) Cu(ppb) Zn(ppb) Rb(ppb) Sr(ppb) Cd(ppb) Ba(ppb) Ce(ppb) Gd(ppb) Pb(ppb) U(ppb)
2  PK-Std1p 2016-05-23 20:01:22        S  -0.013  111.10   31.28   1.050   0.121   0.910   0.157   0.134   0.141   0.010   35.28   0.010   0.145   0.113   0.123   0.036  0.897
3  PK-Std2p 2016-05-23 20:08:10        S   0.018  216.60   41.17   5.095   0.491   4.654   0.294   0.533   0.511   0.048   71.03   0.047   0.500   0.456   0.240   0.081  4.497
4  PK-Std3p 2016-05-23 20:14:59        S   0.057  303.90   48.90   9.695   1.215   9.332   0.487   1.294   1.180   0.093  105.30   0.093   1.164   1.128   0.467   0.132  9.057
5  PK-Std4p 2016-05-23 20:21:48        S   0.234  391.80   57.01  14.060   4.903  14.100   0.704   5.100   4.597   0.239  141.40   0.231   4.583   4.556   0.703   0.965 13.730
6  PK-Std5p 2016-05-23 20:28:36        S   0.477  474.20   64.35  29.560   9.621  30.050   0.908   9.985   9.030   0.467  173.20   0.459   8.909   8.956   0.913   4.506 29.350
8       L1W 2016-05-23 20:42:14        L   0.037  141.90   33.48   0.003   0.714   0.020   0.113   0.200   0.217   0.007   72.64   0.001   0.125   0.008   0.001   0.037  0.012
9       L2W 2016-05-23 20:49:03        L   0.023  131.50   38.09  -0.003   0.590   0.014   0.106   0.134   0.694   0.004   75.96   0.001   0.115   0.008   0.001   0.031  0.008
10      L3W 2016-05-23 20:55:54        L   0.078  208.20   52.54  -0.002   0.843   0.021   0.153   0.180   0.119   0.005  110.40   0.002   0.172   0.011   0.001   0.054  0.009
11     L17W 2016-05-23 21:02:43        L   0.025  152.40   38.64  -0.008   0.658   0.016   0.117   0.270   0.121   0.006   82.45   0.001   0.108   0.008   0.001   0.042  0.007
12     L18W 2016-05-23 21:09:32        L   0.070  204.30   54.29  -0.005   1.311   0.023   0.172   0.417   0.197   0.008  117.00   0.002   0.144   0.010   0.001   0.057  0.010
13     L19W 2016-05-23 21:16:21        L   0.045  181.40   51.45  -0.004   0.701   0.020   0.162   0.296   0.160   0.008  109.20   0.001   0.116   0.009   0.001   0.055  0.009
14     L20W 2016-05-23 21:23:09        L   0.022  150.30   38.55   0.000   0.596   0.016   0.118   0.223   0.148   0.007   77.44   0.001   0.114   0.007   0.001   0.048  0.006
15     L21W 2016-05-23 21:29:59        L   0.010  132.70   34.72  -0.006   0.679   0.014   0.110   0.249   0.153   0.007   67.33   0.001   0.098   0.008   0.001   0.034  0.007
16     L23W 2016-05-23 21:36:49        L   0.035  210.00   48.16   0.006   1.230   0.020   0.155   0.370   0.202   0.008  110.20   0.001   0.251   0.012   0.001   0.055  0.010
17     L24W 2016-05-23 21:43:39        L   0.051  193.00   56.83   0.024   0.825   0.024   0.189   0.404   0.205   0.007  113.80   0.002   0.135   0.010   0.001   0.044  0.010
19      N1W 2016-05-23 21:57:20        N   0.041  205.10   49.06   0.005   1.077   0.021   0.157   0.481   0.143   0.006  102.90   0.002   0.145   0.012   0.001   0.049  0.012
20      N4W 2016-05-23 22:04:10        N  -0.002  140.90   38.72   0.008   0.887   0.016   0.131   0.312   0.130   0.005   76.39   0.001   0.133   0.010   0.001   0.032  0.011
21      N7W 2016-05-23 22:11:00        N   0.005  134.40   40.92   0.002   0.651   0.019   0.136   0.204   0.122   0.005   90.48   0.002   0.158   0.010   0.001   0.034  0.012
22     N10W 2016-05-23 22:17:50        N   0.010  150.10   40.86  -0.001   0.714   0.018   0.132   0.199   0.089   0.004   81.78   0.001   0.149   0.010   0.001   0.029  0.012
23     N11W 2016-05-23 22:24:40        N   0.028  156.10   43.10  -0.007   0.870   0.019   0.139   0.292   0.099   0.005   89.83   0.001   0.134   0.010   0.001   0.034  0.009
24     N12W 2016-05-23 22:31:31        N   0.015  158.60   43.03   0.019   0.807   0.018   0.145   0.253   0.113   0.006   87.60   0.001   0.117   0.011   0.001   0.039  0.009
25     N13W 2016-05-23 22:38:21        N   0.021  157.50   44.94   0.038   0.833   0.020   0.159   0.245   0.124   0.007   92.04   0.001   0.118   0.011   0.001   0.034  0.011
26     N14W 2016-05-23 22:45:12        N   0.041  171.80   49.04   0.008   1.115   0.020   0.165   0.226   0.123   0.006  109.00   0.002   0.177   0.011   0.001   0.044  0.010
27     N18W 2016-05-23 22:52:02        N   0.050  164.60   49.49   0.019   1.555   0.022   0.162   0.735   2.740   0.006  104.50   0.005   4.152   0.011   0.001   0.180  0.008
28     N23W 2016-05-23 22:58:52        N   0.001  132.30   36.21  -0.008   1.578   0.015   0.110   0.838   3.751   0.004   73.86   0.008   6.080   0.009   0.001   0.257  0.009
30     P10W 2016-05-23 23:12:33        P  -0.003  139.50   36.40  -0.005   0.537   0.018   0.123   0.334   0.172   0.005   76.07   0.002   0.127   0.008   0.001   0.033  0.008
31     P16W 2016-05-23 23:19:24        P   0.057  172.90   55.53  -0.003   0.689   0.025   0.186   0.253   0.482   0.004  124.10   0.001   0.122   0.010   0.001   0.041  0.010
32     P17W 2016-05-23 23:26:15        P   0.018  193.80   44.01   0.000   0.780   0.020   0.141   0.269   0.139   0.004   99.34   0.001   0.124   0.011   0.001   0.031  0.010
33     P19W 2016-05-23 23:33:06        P   0.040  181.50   51.98   0.027   0.762   0.026   0.173   0.320   0.191   0.008  108.70   0.002   0.162   0.011   0.001   0.043  0.009
34     P20W 2016-05-23 23:39:57        P   0.049  182.50   53.05   0.007   0.676   0.024   0.180   0.298   0.147   0.007  106.80   0.001   0.133   0.012   0.001   0.033  0.011
35     P21W 2016-05-23 23:46:48        P  -0.005  147.60   39.68   0.010   0.701   0.017   0.135   0.240   0.165   0.007   81.14   0.001   0.111   0.009   0.001   0.034  0.008
36     P22W 2016-05-23 23:53:39        P   0.008  181.40   41.83   0.031   0.789   0.026   0.157   0.604   0.295   0.010   92.27   0.002   0.172   0.015   0.002   0.032  0.017
37     P25W 2016-05-24 00:00:30        P  -0.016  124.30   31.92   0.028   0.596   0.015   0.104   0.265   0.187   0.004   64.91   0.002   0.080   0.008   0.001   0.049  0.007
39  PK-Std1 2016-05-24 00:14:07        S  -0.089   98.38   28.27   0.957   0.125   0.990   0.194   0.156   0.152   0.010   35.49   0.010   0.145   0.116   0.121   0.035  0.890
40  PK-Std2 2016-05-24 00:20:56        S  -0.041  198.80   38.35   4.812   0.504   4.968   0.338   0.570   0.527   0.049   71.38   0.051   0.503   0.465   0.237   0.080  4.520
41  PK-Std3 2016-05-24 00:27:45        S   0.012  289.00   46.70   9.434   1.245   9.890   0.555   1.383   1.227   0.094  105.40   0.094   1.191   1.138   0.472   0.134  9.091
42  PK-Std4 2016-05-24 00:34:34        S   0.166  383.40   56.11  13.920   5.029  14.930   0.771   5.473   4.775   0.241  143.00   0.239   4.623   4.637   0.707   0.962 14.120
43  PK-Std5 2016-05-24 00:41:22        S   0.427  462.20   63.08  29.060   9.831  31.610   0.972  10.650   9.258   0.475  174.30   0.461   8.977   9.092   0.916   4.532 29.790
我最近的编码尝试是:

    j=1     
for (i in 1:nrow(Mdat_samp))
        {       
        divisor<-(as.double(difftime(Blanks[j+1, 2], Blanks[j,2]))-as.double(difftime(Blanks[j+1,2], Mdat_samp[i,2])))/as.double(difftime(Blanks[j+1, 2], Blanks[j,2])) 
        adjust<- (Blanks[j, 4:20]+(Blanks[j+1, 4:20]*divisor))
        write.table((Mdat_samp[i,4:20]-adjust), file="Baseadjust.txt", append=TRUE, col.names=FALSE, row.names=FALSE, sep=",")
        if(as.double(difftime(Mdat_samp[j,2], Blanks[j,2]))<0) j=j+1
        if(j+1>nrow(Blanks)) break
        }
j=1
适用于(i in 1:nrow(Mdat_samp))
{       

除数如果我理解正确,计算的关键是为
Mdat_samp
中的每一行及时找到括号
Blanks
。这是变量
j
的含义,它是该括号下界的
Blanks
的行索引。您可以为所有行计算该
j
Mdat_samp
此括号以“矢量化”方式存在。即,无循环,这也使此计算更快

首先,我们假设
Blanks
中的数据按
Date/Time
升序排序。此外,我们假设
Blanks
Mdat_samp
中的列
Date/Time
都属于日期时间类,如
POSIXct
。如果不是,我们可以使用以下方法从字符转换:

Blanks$`Date/Time` <- as.POSIXct(Blanks$`Date/Time`, format="%Y-%m-%d %H:%M:%S")
Mdat_samp$`Date/Time` <- as.POSIXct(Mdat_samp$`Date/Time`, format="%Y-%m-%d %H:%M:%S")
我们首先使用
expand.grid
创建两个名为
prevBlank
nextBlank
的数据帧。其中每一个都枚举
Mdat_samp
Blanks
中的
Date/Time
的所有组合,以便可以为向量化fa中的
Mdat_samp
中的每一行计算括号条件shion.数据框
prevBlank
包含
Mdat_samp
Var1
列中的
Date/Time
的所有组合,以及
Var2
列中的
Blanks
的所有组合,按
Mdat_samp
中的行顺序排列。同样,数据框
nextBlank
包含
的所有组合>日期/时间
from
Mdat_samp
在其
Var1
列中,以及
空格
中的
Date/Time
列上移了1(即领先)在其
Var2
列中。请注意,我们用
NA
填充移位列,以便生成的数据帧
prevbank
nextBlank
大小相同


表达式
prevBlank$Var1>prevBlank$Var2&nextBlank$Var1请使用
dput()
在您的数据集上,并将结果张贴在此处以使其可复制。此外,您希望的输出是什么?编码爱好者的意思是“热爱编码的人”?什么是
if循环
?感谢您重新格式化Nicola,非常感谢,读起来好多了,很想知道您是如何做到的。这是epo3建议的dput()命令吗?
prevBlank <- expand.grid(Mdat_samp$`Date/Time`, Blanks$`Date/Time`)
nextBlank <- expand.grid(Mdat_samp$`Date/Time`, c(Blanks$`Date/Time`[2:nrow(Blanks)],NA))
j <- which(matrix(prevBlank$Var1 > prevBlank$Var2 & 
                  nextBlank$Var1 <= nextBlank$Var2,nrow=nrow(Mdat_samp)),
           arr.ind=TRUE)[,2]
matrix(prevBlank$Var1 > prevBlank$Var2 & 
       nextBlank$Var1 <= nextBlank$Var2,nrow=nrow(Mdat_samp))
##       [,1]  [,2]  [,3]  [,4]  [,5]
## [1,]  TRUE FALSE FALSE FALSE FALSE
## [2,]  TRUE FALSE FALSE FALSE FALSE
## [3,]  TRUE FALSE FALSE FALSE FALSE
## [4,]  TRUE FALSE FALSE FALSE FALSE
## [5,]  TRUE FALSE FALSE FALSE FALSE
## [6,] FALSE  TRUE FALSE FALSE FALSE
## [7,] FALSE  TRUE FALSE FALSE FALSE
## [8,] FALSE  TRUE FALSE FALSE FALSE
## [9,] FALSE  TRUE FALSE FALSE FALSE
##[10,] FALSE  TRUE FALSE FALSE FALSE
##[11,] FALSE  TRUE FALSE FALSE FALSE
##[12,] FALSE  TRUE FALSE FALSE FALSE
##[13,] FALSE  TRUE FALSE FALSE FALSE
##[14,] FALSE  TRUE FALSE FALSE FALSE
##[15,] FALSE  TRUE FALSE FALSE FALSE
##[16,] FALSE FALSE  TRUE FALSE FALSE
##[17,] FALSE FALSE  TRUE FALSE FALSE
##[18,] FALSE FALSE  TRUE FALSE FALSE
##[19,] FALSE FALSE  TRUE FALSE FALSE
##[20,] FALSE FALSE  TRUE FALSE FALSE
##[21,] FALSE FALSE  TRUE FALSE FALSE
##[22,] FALSE FALSE  TRUE FALSE FALSE
##[23,] FALSE FALSE  TRUE FALSE FALSE
##[24,] FALSE FALSE  TRUE FALSE FALSE
##[25,] FALSE FALSE  TRUE FALSE FALSE
##[26,] FALSE FALSE FALSE  TRUE FALSE
##[27,] FALSE FALSE FALSE  TRUE FALSE
##[28,] FALSE FALSE FALSE  TRUE FALSE
##[29,] FALSE FALSE FALSE  TRUE FALSE
##[30,] FALSE FALSE FALSE  TRUE FALSE
##[31,] FALSE FALSE FALSE  TRUE FALSE
##[32,] FALSE FALSE FALSE  TRUE FALSE
##[33,] FALSE FALSE FALSE  TRUE FALSE
##[34,] FALSE FALSE FALSE FALSE    NA
##[35,] FALSE FALSE FALSE FALSE    NA
##[36,] FALSE FALSE FALSE FALSE    NA
##[37,] FALSE FALSE FALSE FALSE    NA
##[38,] FALSE FALSE FALSE FALSE    NA
update.rows <- which(Mdat_samp$`Date/Time` > Blanks$`Date/Time`[1] &
                     Mdat_samp$`Date/Time` <= Blanks$`Date/Time`[nrow(Blanks)])
divisor<-(as.double(difftime(Blanks[j+1, 2], Blanks[j,2]))-as.double(difftime(Blanks[j+1,2], Mdat_samp[update.rows,2])))/as.double(difftime(Blanks[j+1, 2], Blanks[j,2])) 
adjust<- (Blanks[j, 4:20]+(Blanks[j+1, 4:20]*divisor))
result <- Mdat_samp[update.rows,4:20]-adjust
print(head(result[1:8]))
##     Li(ppb)  Mg(ppb)  Ca(ppm)      Cr(ppb)   Mn(ppb)     Co(ppb)   Ni(ppb)   Cu(ppb)
##1  -0.00149062 111.0865 31.27917  1.051167618 0.1211668  0.91000000 0.1581676 0.1331660
##2   0.04099062 216.5730 41.16833  5.097332382 0.4913332  4.65400000 0.2963324 0.5313340
##3   0.09150000 303.8595 48.89750  9.698500000 1.2155000  9.33200000 0.4905000 1.2915000
##4   0.28000938 391.7460 57.00667 14.064667618 4.9036668 14.10000000 0.7086676 5.0966660
##5   0.53449062 474.1325 64.34583 29.565832382 9.6218332 30.05000000 0.9138324 9.9808340
##6   0.11289989 141.7515 33.47318  0.010453940 0.7148184  0.02009079 0.1207263 0.1948184
##7   0.10579978 131.2841 38.08137  0.004907880 0.5906368  0.01418158 0.1144526 0.1286368
##8   0.16773341 207.9163 52.52954  0.006364040 0.8434544  0.02127281 0.1621825 0.1744544
##9   0.12163330 152.0488 38.62773  0.000817980 0.6582728  0.01636360 0.1269088 0.2642728
##10  0.17353319 203.8814 54.27591  0.004271920 1.3110912  0.02345438 0.1826351 0.4110912
##11  0.15543307 180.9139 51.43410  0.005725860 0.7009097  0.02054517 0.1733614 0.2899097
##12  0.13931609 149.7466 38.53229  0.010178690 0.5957285  0.01663574 0.1300859 0.2167285
##13  0.13423285 132.0790 34.70047  0.004633740 0.6785465  0.01472675 0.1228140 0.2425465
##14  0.16614961 209.3114 48.13864  0.017088790 1.2293645  0.02081776 0.1685421 0.3633645
##15  0.18906637 192.2438 56.80682  0.035543840 0.8241825  0.02490877 0.2032701 0.3971825
##16  0.12544893 204.3643 49.04000  0.011816973 1.0750908  0.02209085 0.1659085 0.4789092
##17  0.09089785 140.1715 38.70000  0.016633946 0.8851817  0.01718170 0.1408170 0.3098183
##18  0.10634678 133.6788 40.90000  0.012450920 0.6492725  0.02027255 0.1467255 0.2017275
##19  0.11979570 149.3861 40.84000  0.011267893 0.7123634  0.01936339 0.1436339 0.1966366
##20  0.14624463 155.3933 43.08000  0.007084866 0.8684542  0.02045424 0.1515424 0.2895458
##21  0.14171416 157.9006 43.01000  0.034906271 0.8055453  0.01954531 0.1584531 0.2504547
##22  0.15616308 156.8079 44.92000  0.055723244 0.8316362  0.02163616 0.1733616 0.2423638
##23  0.18463262 171.1152 49.02000  0.027544649 1.1137272  0.02172723 0.1802723 0.2232728
##24  0.20208154 163.9224 49.47000  0.040361622 1.5538181  0.02381808 0.1781808 0.7321819
##25  0.16153047 131.6297 36.19000  0.015178595 1.5769089  0.01690893 0.1270893 0.8350911
##26  0.10064935 139.5850 36.40000  0.016663961 0.5380000  0.01911093 0.1331109 0.3332219
##27  0.17132468 172.9900 55.53000  0.020331981 0.6900000  0.02622213 0.1962221 0.2524443
##28  0.14300000 193.8950 44.01000  0.025000000 0.7810000  0.02133333 0.1513333 0.2686667
##29  0.17567532 181.6000 51.98000  0.053668019 0.7630000  0.02744453 0.1834445 0.3198891
##30  0.19535065 182.6050 53.05000  0.035336039 0.6770000  0.02555574 0.1905557 0.2981115
##31  0.15202597 147.7100 39.68000  0.040004058 0.7020000  0.01866694 0.1456669 0.2403339
##32  0.17570130 181.5150 41.83000  0.062672078 0.7900000  0.02777814 0.1677781 0.6045563
#333  0.16237662 124.4200 31.92000  0.061340097 0.5970000  0.01688934 0.1148893 0.2657787