估计用于替换NA的值

时间:2013-02-14 21:30:00

标签: r statistics plyr lm

我有一个由几个时间序列组成的数据集,我想在这些时间序列中计算这些时间序列中的估计值来替换NA值。我熟悉ddply()和lm()但是我对这个有点麻烦....

以下是来自一个数据帧的前5个站点

x <- read.table( text="
LOC     YEAR    JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
A       1980    0   0   0   8   104 NA  534 399 202 20  0   0
A       1981    0   0   0   45  121 387 454 309 135 29  0   0
A       1982    0   0   6   25  123 346 459 423 223 11  0   0
A       1983    0   0   0   20  88  294 474 424 296 38  3   0
A       1984    0   0   0   28  192 340 385 339 122 3   0   0
A       1985    0   0   12  40  142 327 407 445 198 13  0   0
A       1986    0   0   0   59  147 290 381 362 176 10  0   0
A       1987    0   0   0   12  83  288 408 395 112 12  0   0
A       1988    0   0   0   8   116 309 393 392 152 11  2   0
A       1989    0   0   7   69  238 366 442 402 158 23  0   0
A       1990    0   1   0   38  186 527 397 298 225 11  0   0
A       1991    0   0   5   15  201 378 374 364 137 25  0   0
A       1992    0   0   0   31  96  284 457 381 212 28  0   0
A       1993    0   0   0   40  149 400 510 425 174 24  0   0
A       1994    0   0   12  37  172 502 524 474 209 49  5   0
A       1995    0   0   14  21  157 340 447 457 220 8   0   0
A       1996    0   3   0   36  361 457 482 378 160 46  0   0
A       1997    0   0   3   19  141 357 481 429 272 51  0   0
A       1998    0   0   9   6   197 438 553 396 323 60  0   0
A       1999    0   0   0   22  147 323 456 465 215 18  0   0
A       2000    0   0   0   53  305 387 503 436 278 53  0   0
A       2001    0   0   0   27  212 416 553 432 246 23  2   0
A       2002    0   0   3   63  192 483 469 499 224 37  1   0
A       2003    0   0   0   32  NA  357 494 480 NA  54  22  0
A       2004    0   0   19  18  222 358 398 318 146 15  0   0
A       2005    0   0   0   4   157 376 472 376 287 46  1   0
A       2006    0   0   5   64  269 435 496 NA  107 29  1   0
A       2007    0   0   3   6   87  336 396 444 264 83  0   0
A       2008    0   0   2   11  181 487 417 399 130 26  0   0
A       2009    0   2   0   32  189 394 509 441 174 50  0   0
A       2010    0   0   4   32  154 490 401 465 299 21  0   0
B       1980    0   0   0   6   108 530 581 411 199 10  0   0
B       1981    0   0   0   55  101 412 451 330 149 25  0   0
B       1982    0   0   6   26  116 346 502 483 244 10  0   0
B       1983    0   0   0   11  93  295 514 488 320 40  0   0
B       1984    0   0   0   31  200 334 402 347 NA  8   0   0
B       1985    0   0   9   40  151 318 431 456 209 16  0   0
B       1986    0   0   3   59  150 298 409 410 179 8   0   0
B       1987    0   0   NA  13  87  315 456 403 137 12  0   0
B       1988    0   0   0   12  NA  327 303 NA  NA  NA  NA  NA
B       1989    NA  0   NA  62  248 366 445 443 187 22  0   0
B       1990    0   0   1   31  171 568 439 321 248 16  0   0
B       1991    0   0   3   27  227 368 361 361 143 15  0   0
B       1992    0   0   0   34  75  268 432 395 224 9   0   0
B       1993    0   NA  0   28  144 411 519 421 169 16  0   0
B       1994    0   0   4   25  139 484 520 485 210 NA  NA  NA
B       1995    NA  NA  7   NA  146 NA  NA  491 219 NA  0   NA
B       1996    NA  NA  0   NA  NA  440 507 NA  NA  50  NA  NA
B       1997    NA  NA  NA  2   NA  266 483 412 252 43  0   0
B       1998    0   0   5   9   208 430 558 417 354 66  0   0
B       1999    NA  0   0   24  111 303 NA  432 206 29  0   0
B       2000    0   0   0   72  338 417 553 468 300 47  0   0
B       2001    NA  0   1   38  215 459 626 481 250 37  6   0
B       2002    0   0   13  84  208 433 528 525 NA  NA  3   0
B       2003    0   0   2   48  220 385 580 483 257 61  12  NA
B       2004    0   0   16  22  231 372 413 352 199 11  0   NA
B       2005    NA  0   0   13  167 NA  529 400 288 49  0   0
B       2006    0   0   6   89  279 459 535 403 100 31  0   0
B       2007    0   0   4   27  68  338 406 452 293 87  0   0
B       2008    0   0   0   31  188 503 439 399 107 28  0   0
B       2009    0   0   NA  21  162 394 468 387 138 33  0   0
B       2010    0   0   0   17  134 439 NA  429 210 13  0   0
C       1987    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  0   0
C       1988    0   0   3   19  228 382 435 422 213 17  16  0
C       1989    0   1   17  100 332 432 543 459 208 66  0   0
C       1990    0   0   2   54  243 615 414 318 255 27  2   0
C       1991    0   0   2   41  304 539 505 513 NA  100 0   0
C       1992    0   0   0   83  157 368 531 452 300 67  0   0
C       1993    0   0   2   79  211 448 572 498 215 75  0   0
C       1994    1   0   21  46  194 580 618 541 257 66  7   0
C       1995    0   0   36  54  224 437 551 532 273 31  2   0
C       1996    0   7   1   70  436 511 550 432 216 62  1   0
C       1997    0   0   11  27  177 412 556 501 336 74  0   0
C       1998    0   0   21  25  308 572 638 475 407 87  0   0
C       1999    0   1   3   58  218 417 536 542 288 55  0   0
C       2000    0   0   0   110 396 446 610 540 380 80  0   0
C       2001    0   0   3   67  290 533 648 533 335 72  12  0
C       2002    0   0   9   161 296 563 534 597 297 62  3   0
C       2003    0   0   3   91  249 435 571 566 NA  100 29  0
C       2004    0   0   26  49  308 416 467 391 212 24  0   0
C       2005    0   0   0   22  197 468 557 NA  355 70  1   0
C       2006    0   0   13  117 NA  488 557 NA  141 36  6   0
C       2007    0   0   6   22  113 376 445 463 292 98  0   0
C       2008    0   0   NA  41  240 554 443 430 NA  57  2   0
C       2009    0   NA  13  62  252 480 530 478 216 61  0   0
C       2010    0   0   1   32  212 525 399 489 309 34  0   0
D       2007    NA  NA  NA  NA  NA  NA  285 NA  213 34  0   NA
D       2008    0   0   0   11  121 NA  301 275 85  29  0   0
D       2009    0   NA  1   23  103 346 NA  389 106 29  0   0
D       2010    0   0   4   6   96  435 323 367 255 14  0   0
E       1980    0   0   2   36  188 583 654 503 279 52  0   0
E       1981    0   0   4   58  NA  455 NA  NA  226 NA  1   1
E       1982    0   3   25  NA  NA  445 553 552 357 49  0   NA
E       1983    0   0   0   58  202 397 549 534 384 90  7   0
E       1984    0   0   3   65  278 407 453 447 226 29  3   0
E       1985    0   0   21  82  237 384 492 534 278 NA  NA  0
E       1986    0   6   7   109 219 354 466 458 258 NA  NA  0
E       1987    0   0   0   42  142 344 475 475 195 56  4   NA
E       1988    0   0   1   23  209 NA  NA  458 247 39  13  0
E       1989    0   3   34  131 314 459 539 478 241 79  0   0
E       1990    0   1   6   74  268 618 444 359 294 43  10  0
E       1991    0   0   15  57  285 439 434 445 193 81  0   0
E       1992    0   0   1   70  143 424 547 473 297 55  0   0
E       1993    0   0   0   67  187 413 582 440 271 103 0   0
E       1994    0   0   10  66  239 585 592 556 284 67  9   0
E       1995    0   0   17  56  205 413 546 531 293 51  0   0
E       1996    0   9   0   73  412 550 580 476 250 88  3   0
E       1997    0   0   14  37  198 433 574 502 369 90  0   0
E       1998    0   0   21  11  332 542 664 473 423 91  0   0
E       1999    0   0   2   94  231 435 562 571 313 63  0   0
E       2000    0   0   9   139 419 437 601 534 361 76  0   0
E       2001    0   0   2   64  285 493 629 521 308 40  10  0
E       2002    0   0   13  131 277 528 524 549 281 72  3   0
E       2003    0   0   3   90  250 420 523 520 NA  86  21  0
E       2004    0   0   35  35  NA  404 470 384 215 34  0   0
E       2005    0   0   0   26  198 452 544 441 391 87  3   0
E       2006    0   0   8   123 NA  489 573 NA  194 74  5   0
E       2007    0   0   12  18  121 389 450 524 346 134 0   0
E       2008    0   0   8   49  239 596 501 488 213 48  0   0
E       2009    0   NA  4   38  260 487 534 499 223 77  0   0
E       2010    0   0   7   36  212 564 454 533 367 38  0   0

 ", header = T)

这里......

我需要删除数据少于7年的任何位置,整个数据集有几百个位置......

然后

用正确的月度位置平均值替换任何NA

我正在尝试计算个别电台的月平均值,并将它们与该电台月份相关联。

我被困在这里......

xFix <- melt(x, id.vars = c("LOC", "YEAR"), measure.vars = c("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"), variable.name = "Month", value.name = "CLDD")

非常感谢任何帮助...

非常感谢你。 杰西

1 个答案:

答案 0 :(得分:0)

FROM SE

这是一个提案。

首先,计算每个LOC的行数,并检查是否有七行或更多行。这用于子集x。

cnt <- table(x$LOC) >= 7

然后cnt用于删除行数不足的LOC。这将创建一个新的数据框tmp。

tmp <- x[x$LOC %in% names(cnt)[cnt], ]

下一个命令非常复杂。 by用于沿LOC的值将函数应用于数据帧的每个子集。由于只对月份列感兴趣,因此仅使用month.abb选择这些列。命令lapply用于将以下函数应用于数据框子集的每一列:将所有NAs替换为列的平均值。

函数as.data.frame和do.call(rbind,...)是获取数据框所必需的。

res <- do.call(rbind, by(tmp[, toupper(month.abb)], 
                     tmp$LOC[drop = TRUE], 
                     FUN = function(y) 
                        as.data.frame(lapply(y, function(z)
                                       replace(z, is.na(z), mean(z, na.rm = TRUE))))))

在最后一步中,前两列与结果合并。

cbind(tmp[c("LOC", "YEAR")], res)

完成。