R

时间:2016-09-09 13:41:27

标签: r loops indexing

对于编码爱好者而言,这可能是一个明智的选择,但作为这些工具的新手,它现在已经扭曲了我的面条一段时间。

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

数据集:

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正确索引,所以我最终对所有后续行应用相同的校正,而不是计算和应用特定行的校正。我看到它运行了两个索引,“for循环”中的“i”和“if循环”中的“j”,但只有一个正在迭代。
很抱歉长篇文章,可能格式很差,我想尽可能多地提供信息,但找不到明确发布数据集的工具。我希望他们看起来不是太可恶。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么计算的关键是Blanks中的每一行中及时找到包围Mdat_samp。这是变量j的含义,它是此括号下限的Blanks行索引。您可以以“矢量化”方式为此括号所存在的j的所有行计算此Mdat_samp。也就是说,没有循环,这也使得这个计算更快。

首先,我们假设Blanks中的数据按Date/Time按升序排序。此外,我们假设Date/TimeBlanks中的列Mdat_samp属于日期时间类,例如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")

请注意,由于特殊字符/,我们必须将列名放在后引号中。

现在,计算j

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]

我们首先使用prevBlank创建两个名为nextBlankexpand.grid的数据框。这些中的每一个都枚举了来自Date/TimeMdat_samp的{​​{1}}的所有组合,以便可以以矢量化方式为Blanks中的每一行评估包围条件。数据框Mdat_samp包含其prevBlank列中Date/Time的{​​{1}}和行{1}}列Mdat_sampVar1的所有组合在Blanks。同样,数据框Var2包含其Mdat_samp列中nextBlank的{​​{1}}和Date/TimeMdat_samp列的所有组合。其Var1列中的1(即潜在客户)。请注意,我们使用Date/Time填充移位列,以便生成的数据框BlanksVar2大小相同。

如果NA prevBlank位于两个相邻的nextBlank prevBlank$Var1 > prevBlank$Var2 & nextBlank$Var1 <= nextBlank$Var2之间,则表达式TRUE将返回Mdat_samp的布尔向量。将此向量重新整形为与Date/Time具有相同行数的矩阵,您将看到每行(对应Blank中的行),最多一行 Date/Time列:

Mdat_samp

该列的索引是Mdat_samp的行索引,它是TRUE括号的下限。我们使用带有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 的{​​{1}}来提取该索引,以返回矩阵索引(row,col),我们从中通过子集(即最后的Blanks)提取列索引。请注意,返回的Date/Time是一个向量,以便以矢量化方式为which的所有行计算包围arr.ind=TRUE,而无需在[,2]行上进行循环。

请注意,如果j中的行没有括号(即Date/TimeMdat_samp行的Mdat_samp超出Mdat_samp范围内Date/Time 1}}),然后该行的所有结果都是Msamp_datDate/Time。在这种情况下,Blanks中的该行会有条目。因此,FALSE中的条目对应NAj位于j Msamp_dat范围内的行,可以通过以下方式找到:Date/Time

Date/Times

如上所述计算Blanks,插值逻辑也可以矢量化方式进行:

update.rows <- which(Mdat_samp$`Date/Time` > Blanks$`Date/Time`[1] &
                     Mdat_samp$`Date/Time` <= Blanks$`Date/Time`[nrow(Blanks)])

请注意,我们只能调整j中的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 行。

使用您发布的数据:

Mdat_samp

我只打印第一个update.rows列。请注意,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 的38行中只有33行是内插的,因为上一个8的时间戳超出了Mdat_samp的范围。