目的是筛选出所有编号以50开头的观测站,源代码如下:
> download.file(url = "http://dapengde.com/r4rookies/obs.zip",
destfile = "c:/r4r/obs.zip", exdir = "c:/r4r")
> unzip(zipfile = "c:/r4r/obs.zip", exdir = "c:/r4r")
> stn <- 50
> obsdir <- "c:/r4r/obs"
> obsfilefull <- dir(obsdir, full.names = T)
> output <- NULL
> for(k in 1:length(obsfilefull))
+ {
+ input <- read.table(obsfilefull[k], header = F,
+ skip = 2, sep = '')
+ obstimestr <- strsplit(
+ readLines(obsfilefull[k])[2], ' ')[[1]]
+ obstime <- paste('20', obstimestr[3], '-', obstimestr[5], '-',
+ obstimestr[7], ' ', obstimestr[9], str = '')
+ output_new <- input[which(
+ input[, 1] >= stn * 1000 & input[, 1] < (stn + 10) * 1000), c(1, 4)]
+ output_new$time <- obstime
+ output <- rbind(output,output_new)
+
+ }
> output
V1 V4 time
1 53352 1377 20 07 - 06 - 01 02
2 57378 66 20 07 - 06 - 01 02
3 57256 287 20 07 - 06 - 01 02
4 56571 1592 20 07 - 06 - 01 02
5 59948 7 20 07 - 06 - 01 02
6 59096 215 20 07 - 06 - 01 02
7 57972 184 20 07 - 06 - 01 02
8 54497 14 20 07 - 06 - 01 02
9 54335 38 20 07 - 06 - 01 02
10 54527 4 20 07 - 06 - 01 02
11 57741 281 20 07 - 06 - 01 02
12 58734 196 20 07 - 06 - 01 02
17 57583 36 20 07 - 06 - 01 02
18 57265 91 20 07 - 06 - 01 02
19 57545 460 20 07 - 06 - 01 02
20 57355 335 20 07 - 06 - 01 02
21 57381 98 20 07 - 06 - 01 02
22 57279 127 20 07 - 06 - 01 02
24 56287 629 20 07 - 06 - 01 02
25 57482 26 20 07 - 06 - 01 02
26 57259 427 20 07 - 06 - 01 02
27 57359 276 20 07 - 06 - 01 02
28 58715 82 20 07 - 06 - 01 02
29 57798 86 20 07 - 06 - 01 02
210 57378 66 20 07 - 06 - 01 05
31 57256 287 20 07 - 06 - 01 05
41 53352 1377 20 07 - 06 - 01 05
51 58457 43 20 07 - 06 - 01 05
61 58336 20 20 07 - 06 - 01 05
71 57718 1037 20 07 - 06 - 01 05
81 57841 321 20 07 - 06 - 01 05
91 57972 184 20 07 - 06 - 01 05
101 54527 4 20 07 - 06 - 01 05
111 54497 14 20 07 - 06 - 01 05
121 54335 38 20 07 - 06 - 01 05
13 59096 215 20 07 - 06 - 01 05
14 59288 7 20 07 - 06 - 01 05
15 50953 143 20 07 - 06 - 01 05
16 50656 272 20 07 - 06 - 01 05
171 50867 135 20 07 - 06 - 01 05
181 50779 66 20 07 - 06 - 01 05
191 50246 359 20 07 - 06 - 01 05
201 50963 110 20 07 - 06 - 01 05
211 50950 150 20 07 - 06 - 01 05
221 50353 178 20 07 - 06 - 01 05
23 50877 101 20 07 - 06 - 01 05
241 58619 51 20 07 - 06 - 01 05
251 57894 838 20 07 - 06 - 01 05
261 58502 37 20 07 - 06 - 01 05
271 59092 207 20 07 - 06 - 01 05
281 58806 210 20 07 - 06 - 01 05
291 58718 107 20 07 - 06 - 01 05
110 57279 127 20 07 - 06 - 01 08
212 57256 287 20 07 - 06 - 01 08
32 53687 752 20 07 - 06 - 01 08
42 56287 629 20 07 - 06 - 01 08
82 58820 345 20 07 - 06 - 01 08
92 53352 1377 20 07 - 06 - 01 08
102 50867 135 20 07 - 06 - 01 08
112 50656 272 20 07 - 06 - 01 08
122 50955 167 20 07 - 06 - 01 08
131 50877 101 20 07 - 06 - 01 08
141 50246 359 20 07 - 06 - 01 08
151 50353 178 20 07 - 06 - 01 08
161 59478 33 20 07 - 06 - 01 08
172 54527 4 20 07 - 06 - 01 08
182 56846 1589 20 07 - 06 - 01 08
192 57894 838 20 07 - 06 - 01 08
202 59092 207 20 07 - 06 - 01 08
213 59102 303 20 07 - 06 - 01 08
222 54497 14 20 07 - 06 - 01 08
231 54335 38 20 07 - 06 - 01 08
242 54455 10 20 07 - 06 - 01 08
252 57494 27 20 07 - 06 - 01 08
262 57378 66 20 07 - 06 - 01 08
272 57583 36 20 07 - 06 - 01 08
282 57290 83 20 07 - 06 - 01 08
113 57256 287 20 07 - 06 - 01 11
214 58336 20 20 07 - 06 - 01 11
33 58047 5 20 07 - 06 - 01 11
43 58259 6 20 07 - 06 - 01 11
52 57378 66 20 07 - 06 - 01 11
62 53352 1377 20 07 - 06 - 01 11
72 53687 752 20 07 - 06 - 01 11
83 59845 169 20 07 - 06 - 01 11
93 57741 281 20 07 - 06 - 01 11
103 57912 989 20 07 - 06 - 01 11
114 57996 135 20 07 - 06 - 01 11
123 59096 215 20 07 - 06 - 01 11
132 56571 1592 20 07 - 06 - 01 11
142 56287 629 20 07 - 06 - 01 11
152 54527 4 20 07 - 06 - 01 11
162 59133 23 20 07 - 06 - 01 11
173 58818 359 20 07 - 06 - 01 11
183 58933 871 20 07 - 06 - 01 11
193 58820 345 20 07 - 06 - 01 11
203 54335 38 20 07 - 06 - 01 11
215 57798 86 20 07 - 06 - 01 11
223 57799 65 20 07 - 06 - 01 11
232 58502 37 20 07 - 06 - 01 11
243 57789 184 20 07 - 06 - 01 11
253 59092 207 20 07 - 06 - 01 11
263 58806 210 20 07 - 06 - 01 11
273 58637 115 20 07 - 06 - 01 11
283 58705 88 20 07 - 06 - 01 11
292 59102 303 20 07 - 06 - 01 11
34 53352 1377 20 07 - 06 - 01 14
44 57378 66 20 07 - 06 - 01 14
53 50246 359 20 07 - 06 - 01 14
63 50779 66 20 07 - 06 - 01 14
73 58336 20 20 07 - 06 - 01 14
115 58047 5 20 07 - 06 - 01 14
124 57741 281 20 07 - 06 - 01 14
133 57912 989 20 07 - 06 - 01 14
143 57259 427 20 07 - 06 - 01 14
153 57395 72 20 07 - 06 - 01 14
163 59096 215 20 07 - 06 - 01 14
174 50953 143 20 07 - 06 - 01 14
184 50867 135 20 07 - 06 - 01 14
194 50877 101 20 07 - 06 - 01 14
204 54096 498 20 07 - 06 - 01 14
216 50963 110 20 07 - 06 - 01 14
224 59845 169 20 07 - 06 - 01 14
233 56571 1592 20 07 - 06 - 01 14
244 54527 4 20 07 - 06 - 01 14
254 53687 752 20 07 - 06 - 01 14
264 53419 1056 20 07 - 06 - 01 14
274 53467 1018 20 07 - 06 - 01 14
284 53533 1390 20 07 - 06 - 01 14
293 53730 1335 20 07 - 06 - 01 14
116 53352 1377 20 07 - 06 - 01 17
217 57378 66 20 07 - 06 - 01 17
35 56287 629 20 07 - 06 - 01 17
45 58336 20 20 07 - 06 - 01 17
54 59001 674 20 07 - 06 - 01 17
64 57395 72 20 07 - 06 - 01 17
74 57458 620 20 07 - 06 - 01 17
84 50779 66 20 07 - 06 - 01 17
94 50246 359 20 07 - 06 - 01 17
104 50867 135 20 07 - 06 - 01 17
117 50953 143 20 07 - 06 - 01 17
125 50877 101 20 07 - 06 - 01 17
134 50955 167 20 07 - 06 - 01 17
144 50745 147 20 07 - 06 - 01 17
154 54096 498 20 07 - 06 - 01 17
164 50963 110 20 07 - 06 - 01 17
175 54527 4 20 07 - 06 - 01 17
185 56571 1592 20 07 - 06 - 01 17
195 56386 422 20 07 - 06 - 01 17
205 56666 1191 20 07 - 06 - 01 17
218 56492 342 20 07 - 06 - 01 17
225 59096 215 20 07 - 06 - 01 17
234 53687 752 20 07 - 06 - 01 17
245 58619 51 20 07 - 06 - 01 17
255 58600 80 20 07 - 06 - 01 17
265 57894 838 20 07 - 06 - 01 17
275 58502 37 20 07 - 06 - 01 17
285 59092 207 20 07 - 06 - 01 17
294 58634 114 20 07 - 06 - 01 17
结果中显然多了很多50开头以外的其它数据,细思之下是因为下面这行代码的范围是50000 - 59999
input[, 1] >= stn * 1000 & input[, 1] < (stn + 10) * 1000), c(1, 4)]
而作如下稍改之后,范围则应该是50000 - 50999(以50开头),但是运行之后结果却出乎意料...
> stn <- 50
> obsdir <- "c:/r4r/obs"
> obsfilefull <- dir(obsdir, full.names = T)
> output <- NULL
> for(k in 1:length(obsfilefull))
+ {
+ input <- read.table(obsfilefull[k], header = F,
+ skip = 2, sep = '')
+ obstimestr <- strsplit(
+ readLines(obsfilefull[k])[2], ' ')[[1]]
+ obstime <- paste('20', obstimestr[3], '-', obstimestr[5], '-',
+ obstimestr[7], ' ', obstimestr[9], str = '')
+ output_new <- input[which(
+ input[, 1] >= stn * 1000 & input[, 1] < (stn + 1) * 1000), c(1, 4)]
+ output_new$time <- obstime
+ output <- rbind(output,output_new)
+
+ }
Error in `$<-.data.frame`(`*tmp*`, "time", value = "20 07 - 06 - 01 02 ") :
replacement has 1 row, data has 0
> output
NULL
输出结果为空!
stn+1(+2或+3)
,结果都是为空,报错也是一样,直至stn+4
开始就会输出结果,但所要的信息依旧除50开头的之外还有53开头的。