对于编码爱好者而言,这可能是一个明智的选择,但作为这些工具的新手,它现在已经扭曲了我的面条一段时间。
基本上我有一些化学计量学数据,我希望通过样品分析间隔运行一系列空白。所有输出都带有时间戳,我想在两个连续空白之间的间隔加上最后一个空白值,使用样本和下一个空白之间的间隔比例,作为应用校正因子的简单插值的修改器。当样本时间值晚于第二个空白时,我想增加空白对,这样我就可以根据新时间段之间的样本应用基于新空白对的校正。 我的数据集包含一系列元素,并且元素之间的空白更正不同。
数据集:
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”,但只有一个正在迭代。
很抱歉长篇文章,可能格式很差,我想尽可能多地提供信息,但找不到明确发布数据集的工具。我希望他们看起来不是太可恶。
答案 0 :(得分:0)
如果我理解正确,那么计算的关键是在Blanks
中的每一行中及时找到包围Mdat_samp
。这是变量j
的含义,它是此括号下限的Blanks
行索引。您可以以“矢量化”方式为此括号所存在的j
的所有行计算此Mdat_samp
。也就是说,没有循环,这也使得这个计算更快。
首先,我们假设Blanks
中的数据按Date/Time
按升序排序。此外,我们假设Date/Time
和Blanks
中的列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
创建两个名为nextBlank
和expand.grid
的数据框。这些中的每一个都枚举了来自Date/Time
和Mdat_samp
的{{1}}的所有组合,以便可以以矢量化方式为Blanks
中的每一行评估包围条件。数据框Mdat_samp
包含其prevBlank
列中Date/Time
的{{1}}和行{1}}列Mdat_samp
中Var1
的所有组合在Blanks
。同样,数据框Var2
包含其Mdat_samp
列中nextBlank
的{{1}}和Date/Time
列Mdat_samp
列的所有组合。其Var1
列中的1(即潜在客户)。请注意,我们使用Date/Time
填充移位列,以便生成的数据框Blanks
和Var2
大小相同。
如果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/Time
中Mdat_samp
行的Mdat_samp
超出Mdat_samp
范围内Date/Time
1}}),然后该行的所有结果都是Msamp_dat
或Date/Time
。在这种情况下,Blanks
中的该行会有否条目。因此,FALSE
中的条目对应NA
中j
位于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
的范围。