我有一个由几个时间序列组成的数据集,我想在这些时间序列中计算这些时间序列中的估计值来替换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")
非常感谢任何帮助...
非常感谢你。 杰西
答案 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)
完成。