2017-09-20 3 views
0

Je veux des données non seulement sans observations manquantes pour une année donnée, mais aussi, pour les données des autres traitements à ne pas être utilisés à partir de cette année. J'ai d'autres facteurs (et ils ne sont pas tous cohérents entre les sites) mais voici un exemple avec le site et le combo trt. Ceci est typique du fait que le nombre de rangées varie également.Sous-ensemble de données où aucune combinaison de niveaux de facteur NA pour une année donnée

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) 

Bien sûr, je peux demander un vecteur logique comme

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

mais qui me laisse avec des années de données de rendement comme 1 site quand il manque pour une trt. Comment puis-je utiliser quelque chose comme appliquer ou par pour obtenir des cas complets pour chaque année? La première chose que je pensais était de jeter, puis faire complete.cases ce en quelque sorte:

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

Les données pour le site b ressemble

> okc 
... 
, , site = b 

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

Je veux se débarrasser de l'année 2 complètement seulement pour le site b. Alors, la prochaine:

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

Comment puis-je l'utiliser pour se débarrasser de trt site de combos de facteur de chaque année pour FAUX? Maintenant ordinairement avec une trame de données, vous pouvez utiliser vecteur logique pour se débarrasser de ce que vous ne voulez pas. Mais je ne suis pas expérimenté et ne peux pas trouver une réponse sur la façon de l'appliquer à la matrice dans la version df ci-dessus, comme (complete.cases(ok[,"yield"]). Comment faire des cas complets, soit par combinaison de facteurs (by(ok[, 2:3], ok[,"years"], complete.cases ne fonctionne pas) ou sur un tableau? Ou y a-t-il quelque chose de plus simple? Puis-je remplacer des cas complets pour la fonction de densité dans this question?

Répondre

1

Regardez dans chaque groupe défini par la combinaison de year et site, et ne garder que les groupes qui n'ont pas de NA valeurs:

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 

Si vos données est grande, pensez data.table pour une augmentation de la vitesse:

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

Ce fait ce que j'ai besoin, mais le temps qu'il faut pour exécuter monte de façon exponentielle le nombre de facteurs dans « la liste » monte. Le temps écoulé va de 0,02 pour 2 facteurs à 1,44 avec 3 à 130,71 avec 4. Une manière de rendre plus efficace si j'ai de plus en plus des facteurs? Merci – Anomie

+0

@Anomie - si vous avez affaire à un grand nombre de groupes/facteurs, essayez data.table. Voir mon édition en un instant. – thelatemail

+1

Grande différence, essentiellement instantanée. – Anomie