2017-09-20 2 views
0

特定の年の観測値が欠落していないだけでなく、他の治療データもその年から使用されないようにするデータが必要です。私は他の要因も持っています(サイト間で一貫性があるわけではありません)が、ここではサイトとtrtのコンボだけを例にしています。これは、行の数も変化する点で典型的です。もちろん特定の年の因子レベルの組み合わせがNAでないデータのサブセット

ok1<-data.frame(year=(c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5)), 
       yield=c(NA,65,NA,45,34,65,43,88,NA,33,23,11,23,54,12), 
       trt=c("ct","nt","dt"), site="a") 
ok2<-data.frame(year=(c(1,1,1,2,2,2,3,3,3,4,4,4)), 
       yield=c(21,22,23,NA,34,65,43,86,39,36,43,41), 
       trt=c("ct","nt","dt"), site = "b") 
ok<-rbind(ok1,ok2) 

、私は

complete.cases(ok[,"yield"]) 

のような論理ベクトルを求めることができますが、それは1つのTRTのために不足しているときには、サイトAに1のような収率データの年で私を残します。 applyやbyのようなものを使って、毎年完全なケースを得るにはどうすればいいですか?私はキャストすることだと思った まず最初は、その後、何とかその上complete.casesの操作を行います。

okc<-cast(ok, year~trt~site, value="yield") 

データは、サイトBのためには、だから私は完全にだけで年間2を取り除きたい

> okc 
... 
, , site = b 

    trt 
years ct dt nt 
    1 21 23 22 
    2 NA 65 34 
    3 43 39 86 
    4 36 41 43 

のように見えますサイトbの場合。だから、次の:

okl<-apply(okc,3,complete.cases) #data is complete on 3rd dimension, i.e for a given year at a given site 

はどのようにして、各FALSEのためのTRT サイト年因子コンボを取り除くためにこれを使用するのですか? 通常、データフレームを使用すると、論理ベクトルを使用して、望ましくないものを取り除くことができます。しかし、私は経験はありません。のように、上記のdfバージョンの配列にこれをどのように適用するかについての答えは見つかりません。因子の組み合わせ(by(ok[, 2:3], ok[,"years"], complete.casesは機能しません)または配列のいずれかで完全なケースを行うにはどうすればよいですか?それとももっと簡単なことがありますか?私はyearsiteの組み合わせによって定義された各グループを介してthis question?

答えて

1

ルックで密度関数のための完全な例に置き換え、そして唯一の任意のNA値を持たないグループを維持することができます:

ok[with(ok, ave(is.na(yield), list(year,site), FUN=sum)==0),] 

# year yield trt site 
#4  2 45 ct a 
#5  2 34 nt a 
#6  2 65 dt a 
#10 4 33 ct a 
#11 4 23 nt a 
#12 4 11 dt a 
#13 5 23 ct a 
#14 5 54 nt a 
#15 5 12 dt a 
#16 1 21 ct b 
#17 1 22 nt b 
#18 1 23 dt b 
#22 3 43 ct b 
#23 3 86 nt b 
#24 3 39 dt b 
#25 4 36 ct b 
#26 4 43 nt b 
#27 4 41 dt b 

場合あなたのデータが大きい場合、速度向上のためのdata.tableを考慮してください。

library(data.table) 
setDT(ok) 
ok[, if(!any(is.na(yield))) .SD, by=.(year,site)] 
+0

をこれは私が必要なものありませんが、それが実行に要する時間は、「リスト」に多くの要因として指数関数的に上昇 上がる。経過時間は、2因子の場合0.02から3因子の場合は1.44に、4因子の場合は130.71になります。これ以上の要因がある場合、これをより効率的にする方法はありますか?ありがとう – Anomie

+0

@Anomie - 多数のグループ/要因を扱っている場合は、data.tableを試してみてください。私の編集を一瞬で見てください。 – thelatemail

+1

巨大な違い、基本的に瞬間。 – Anomie

関連する問題