对于R

时间:2016-09-27 23:10:51

标签: r

我有一个数据帧,每个变量都有不同的长度(较短的变量有NA值)。

    V1  V2  V3  V4  V5  V6  V7  V8  V9
1  581 466 528 424 491 500 652 219 520
2  655 320 532 350 508 498 660  85 473
3  479 349 510 150 490 499 611 598 459
4  855 585 471  92 508 499 557 668 493
5  318 538 506 113 492 499 347 291 483
6  581 329 502 265 509 502 301 293 511
7  741 359 536 399 498 500 565 690 506
8  257 475 521 296 498 502 316  53 536
9  759 434 538 447 490 500 614 449 524
10 525 527 506 174 499 500 649 395 456
11 621 670 489 756 497 498 401 443 465
12 789 307 504 808 501 498 499  63 533
13 368 392 515 940 496 501 638 909 514
14 242 549 480 380 503 501 489 347 465
15 432 405 451 914 493 501 319 324 541
16 608 609 514 441 497 499 572 932 473
17 301 691 548 783 497 502 458 301 482
18 792 638 493 964 505 498 378 692 500
19 727 377 536 974 491 499 301 957 524
20 597 463 518 418 491 499 626 245 504
21 700 407 549 375 501 501 351 706 495
22 705 661 493 798 492 501 660 694 494
23 454 426 523  28 504 498 362 797 471
24 432 627 452 550 491 500 474  50 500
25 124 338 501 779 499 502 684 316 514
26 826 683 477 751 492 502 632 308 524
27 218 631 500 296 502 498 693 169 515
28 460 652 502 306 505 498 666 988 459
29 683 621 521 956 498 501 404 218 497
30 316 372 516 524 500 499 405  54 461
31 503 370 520 429 500 502 510 579 493
32 357 369 521 480 495 501 410 667 470
33 451 617 524 191 493 498 535 668 450
34 335 498 522 713 493 498 566  67 520
35 473 421 479 834 497 499 696 670 541
36 447 360 451 708 492 501 528 744 538
37 137 490 490 740 508 500 630 590 469
38 228 455 488  91 500 501 426 477 472
39 873 555 456 520 510 500 662 154 536
40 564 364 532 236 504 498 338 497 516
41 216 480 460 498 503 502 605 566 520
42 389 572 532 943 501 499 572 150 539
43 490 531 536 941 501 502 653 557 508
44 772 421 536 693 507 498 447 861 451
45 390 403 454 985 509 498 695 859 516
46 264 369 550 962 494 498 684 317 504
47 269 667 508 199 490 501 690 757 481
48 877 616 484 516 495 501 300 636 472
49 755 534 511 882 510 499 547 530 479
50 447 455 490  91 504 501 572  NA 539
51 137 555 488 520 503 500 653  NA  NA
52 228 364 456 236 501 498 447  NA  NA
53 873 480 532 498 501 502  NA  NA  NA
54 564  NA 460 943 507 499  NA  NA  NA
55 216  NA 532 941 509  NA  NA  NA  NA
56 389  NA 490 693  NA  NA  NA  NA  NA
57 490  NA 488 985  NA  NA  NA  NA  NA
58 772  NA 456  NA  NA  NA  NA  NA  NA
59 390  NA 532  NA  NA  NA  NA  NA  NA
60 264  NA 460  NA  NA  NA  NA  NA  NA
61 269  NA 532  NA  NA  NA  NA  NA  NA
62 877  NA  NA  NA  NA  NA  NA  NA  NA
63 755  NA  NA  NA  NA  NA  NA  NA  NA

我在每个变量上运行操作。 首先,我按照每个变量的升序在单个向量中剪切数据帧:

a1=dat0[order(dat0$V1),"V1"]
 a2=dat0[order(dat0$V2),"V2"]
 a3=dat0[order(dat0$V3),"V3"]
 a4=dat0[order(dat0$V4),"V4"]
 a5=dat0[order(dat0$V5),"V5"]
 a6=dat0[order(dat0$V6),"V6"]
 a7=dat0[order(dat0$V7),"V7"]
 a8=dat0[order(dat0$V8),"V8"]
 a9=dat0[order(dat0$V9),"V9"]

接下来,我删除NA。

 a1=a1[!is.na(a1)]
 a2=a2[!is.na(a2)]
 a3=a3[!is.na(a3)]
 a4=a4[!is.na(a4)]
 a5=a5[!is.na(a5)]
 a6=a6[!is.na(a6)]
 a7=a7[!is.na(a7)]
 a8=a8[!is.na(a8)]
 a9=a9[!is.na(a9)]

最后,我计算每个变量的25%最低值的平均值(仅在第一个变量的代码下面)

le.1=seq(1:length(a1))
fr.1=le.1/length(a1)
df.1=data.frame(a1,le.1,fr.1)
lq.1=df.1[fr.1<=0.25,]
lqavg.1=mean(lq.1$a1)

我得到的最终结果是:

   lqavg.1  lqavg.2  lqavg.3  lqavg.4  lqavg.5 lqavg.6  lqavg.7 lqavg.8  lqavg.9
1 224.6667 351.5385 463.1333 175.5714 491.3846     498 347.9231  127.25 462.3333

目标是编写for循环或找到一个函数来执行此操作而无需为每个变量编写代码。

有了Barker友好建议的功能,我得到了:

> apply(dat0, 2, function(x) mean(x[x <= quantile(x, 0.25, na.rm = TRUE)], na.rm = TRUE))
      V1       V2       V3       V4       V5       V6       V7       V8       V9 
230.3750 353.3571 467.2778 184.2667 491.5000 498.0000 347.9231 139.8462 463.0769 

> apply(dat0, 2, function(x) mean(x[x < quantile(x, 0.25, na.rm = TRUE)], na.rm = TRUE))
      V1       V2       V3       V4       V5       V6       V7       V8       V9 
230.3750 351.5385 463.1333 175.5714 491.5000 498.0000 347.9231 127.2500 463.0769 

感谢任何帮助!

谢谢!

1 个答案:

答案 0 :(得分:0)

这太荒谬了。以下是将代码翻译为使用sapply的方法:

sapply(dat0, function(x) {
    x = x[order(x)]        
    x = x[!is.na(x)]
    x = x[(1:length(x)) / length(x) <= 0.25]
    return(mean(x))
})
# V1       V2       V3       V4       V5       V6       V7       V8       V9 
# 224.6667 351.5385 463.1333 175.5714 491.3846 498.0000 347.9231 127.2500 462.3333

这遵循与您的代码完全相同的步骤(订单,删除缺失值,根据长度获取25%的剩余值,找到平均值)。它的输出与你的相匹配。 sapply将在数据框的每一列上调用一个函数。在这里,我们创建了一个匿名函数,它可以执行我们想要调用的列。