2016-05-20 8 views
0

複数のテスト(パラメータと呼ばれる)を異なる「ダイ」に適用するデータがあり、各「ダイ」は特定のテストを合格または不合格にすることができます。ここで複数の出力を持つファンクションを使用する

はalldie

die      parameter firstfailure 
1  1 Resistance_Test DevID (Ohms) 428  FALSE 
2  1   Diode_Test SUBLo (V) 353  FALSE 
3  1  Gate_Test V1_WELL (V) 361  FALSE 
4  1  Gate_Test V2_WELL (V) 360  FALSE 
5  1  Gate_Test V3_WELL (V) 361  FALSE 
6  1 Class_Test Cluster Class2 (#) 6  FALSE 
7  1 Class_Test Column Class1 (#) 2   TRUE 
8  1 Class_Test Cluster Class1 (#) 2   NA 

私は完全なデータセットを提供する場合は、あなたがより多くの異なる、(...、1,2,3番)複数のダイを参照してくださいねという名前のデータフレームのごく一部であります最初の失敗では、テストが実行されなかった場合はFALSE(成功した場合)またはTRUE(失敗した場合)および場合によってはNAと表示されます。

は、私は、各テスト(パラメータ)、渡された番号を経由死ぬの数、および関数を記述して、これがないtapply

ly <- function(data) { 
    ndie <- sum(!is.na(data)) 
    npass <- ndie - sum(data,na.rm = TRUE) 
    yield <- npass/ndie 
    c(npass,ndie,yield) 
} 

使用して、渡された割合を計算することができると思いました私が欲しいの計算が、その後lim_yldがどのように見える(最初の数行のみ、ともtapplyアルファベット順にパラメータを置く)出力

tapply(alldie$firstfailure, alldie$parameter, ly)) -> lim_yld 

を使用するために、いくつかの困難を生じ

件の
$`Class_Test Cluster Class1 (#) 2` 
[1] 76 76 1 

$`Class_Test Cluster Class2 (#) 6` 
[1] 89 89 1 

$`Class_Test Column Class1 (#) 2` 
[1] 76.0000000 89.0000000 0.8539326 

質問:

  1. 私は、より読みやすいデータフレームにデータを取得できますか?このようなもの: Parameter Npass Ndie Proportion Class_Test Cluster Class1 (#) 2 76 76 1.0000000 Class_Test Cluster Class2 (#) 6 89 89 1.0000000 Class_Test Column Class1 (#) 2 76 89 0.8539326

  2. このデータフレーム内のパラメータを元の順序で並べ替えるにはどうすればよいですか?

ありがとう!

+0

私はあなたの例のデータを読み込むしようとしたが、多分 'lapply(スプリット(alldie $ firstfailure、alldie $パラメータ)していません、ly) 'あなたが何をやっているのか、もっと簡単に' tapply'の 'option simplify = FALSE(おそらく同じことをします)を設定してください。 – Frank

+0

ありがとう、フランクですが、同じように比較的読めなくて使いにくいものです。 –

+1

さて、あなたが何をしているのか分かります。 1つの問題は、列名を自動的に生成できないことです。名前付き引数 'c(npass = npass、...)'で何かを返すように関数を変更したいと思うかもしれません。これで 'do.call(rbind、lim_yld)'を行うことができます。あなたがパッケージを開いているなら、このsplit-apply-combineを行う簡単な方法があります。 – Frank

答えて

1

この解決方法はどうですか? tapplyの結果を受け取り、データフレームに変換します。列見出しおよびパラメータ名を追加します。

df<-as.data.frame(matrix(unlist(lim_yld), ncol=3, byrow=TRUE)) 
names(df)<-c("npass","ndie","yield") 
df<-cbind(parameter=names(lim_yld), df) 

コメントとして上記の列名に関しては非常に一般的ではない言及し、それはあなたの関数の戻り値と整合しません。 tapplyは、リストを返すことは逆に表示されますが、念のためにこの作業をする必要があります:

df<-df[order(df$parameter, alldie$parameter),] 
関連する問題