2016-09-27 6 views
0

データフレームがあり、各変数の長さが異なります(短い変数にはNA値があります)。Rのデータフレームのループについて

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を削除します。

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 

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)] 

最後に、私があります(最初の変数のコードの下)

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) 

最終結果を各変数の25%最小値の平均を計算します

目的は、forループを作成するか、各変数のコードを記述せずにこれを行う関数を見つけることです。親切・バーカーによって提案された機能を持つ

、私が取得:

> 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 

すべてのヘルプは歓迎です!

ありがとうございます!

+0

ようこそ!問題を実行して、あなたの質問の下で文脈の中で使用しているコードを投稿したときの問題点を列挙してください。誰もが必要なものを手早く手に入れることができます。 Ta! – AER

+4

各変数の長さが異なります。これはデータフレームの場合は不可能です。その中にNAがあるということなのですか? –

+0

不明です。クローズアップをキャスティングするように1時間以内に明確にする要求への応答はさらにありません。 –

答えて

0

これはばかげている。 、これはあなたのコードと全く同じ手順に従います

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を使用するようにコードを変換する方法を説明します。それはあなたのものと一致します。 sapplyは、データフレームのすべての列で関数を呼び出します。ここでは、匿名のという関数を呼び出して、それが呼び出されている列に欲しいものを行います。

+0

ワウグレゴル、ありがとう。これは私が探していた答えです。私はポストのタイトルを変更する必要があるのだろうか(なぜならそれはもうforループではないからだ!) – Jerry

+0

さて、あなたの質問はforループに関するものでした。答えはforループではないことが判明しました。 – Gregor

+0

また、コメント内のBarkerの提案にフォローアップするために、 '?quantile'関数には多くのオプションがあり、考えるより複雑です。 'type = 6'という引数を与えても、あなたが望むようなことをする可能性は十分にあります(あるいは、quantileを使うために私の解を単純化することもできます)。 – Gregor