Peut-être que c'est quelque chose de base, mais je ne pouvais pas trouver la réponse. Je dois sélectionner uniquement les lignes qui ont le même identifiant, mais elles sont dans les trois années 2009, 2010 et 2011. P>
J'ai d1_3 <- subset(d1, Year==2009 |Year==2010 |Year==2011 )
4 Réponses :
Cela devrait faire le travail :)
library(plyr) ds<-ddply(ds,.(Id),mutate,Nobs=length(Year)) ds[ds$Nobs == 3 & ds$Year %in% 2009:2011,]
Merci d'avoir répondu! mais ne résout pas le problème. Il continue à choisir certaines observations qui n'ont qu'un ou deux ans. Je choisirais toutes les observations qui ont toutes les années dans l'enquête (2009, 2010 et 2011)
Désolé, après avoir posté la réponse, j'ai trouvé une erreur. J'ai posté une réponse de travail avec le paquet Plyr. Mais si vous souhaitez utiliser la fonction R Standard R, veuillez vous reporter à @henrik Anwser.
Cela ne parviendra pas à donner si une pièce d'identité survient pendant un an autre et le long de 2009, 2010, 2011
Mais la question concerne des années de 2009 à 2011, alors je pense que dans ce cas, cela fonctionnera.
Je pense que Ave code> pourrait être utile ici. J'appelle votre cadre de données original 'DF'. Pour chaque identifiant, vérifiez si 2009-2011 est présent en année (
2009: 2011% en% x code>). Cela donne un vecteur logique, qui peut être
somme code> med. Testez si la somme est égale à 3 (si toutes les années sont présentes, la somme est 3), ce qui permet un nouveau vecteur logique, utilisé pour sous-ensemble lignes de la trame de données.
+1 merci beaucoup! Cela semble bien fonctionner. Sélectionnez les observations qui ont les années.
@ Tappin73, veuillez noter que j'ai changé x% en% 2009: 2011 code> à
2009: 2011% en% x code>. Comparez par exemple
C (2009, 2009, 2009)% en% 2009: 2011 Code> et
2009: 2011% en% C (2009, 2009, 2009) Code>
@Henrik: Votre changement ne devrait faire aucune différence .. Parce que vous obtiendrez toujours exactement 3 une somme dans les deux cas.
@Chinmaypatil, merci pour votre commentaire! Somme (C (2009, 2009, 2009)% en% 2009: 2011) Code> est 3, malgré toutes les années ne sont pas représentées. C'est pourquoi je les échangeais.
Une autre façon d'utiliser Ave code>
Je pense qu'une approche utilisant Encore une fois, je viens de le jeter là pour fournir des options à utiliser différents Aspects de la langue. P> Ave code> est raisonnable. Mais il y a beaucoup de façons de résoudre ce problème. Je montre quelques autres manières à partir de la base R. Puis, dans les 2 derniers exemples, je présenterai le package
data.table code>.
# medium way
library(data.table)
d2 <- as.data.table(d1)
d2[ID%in%d2[Year%in%2009:2011, list(logic=nrow(.SD)==3),by="ID"][(logic),ID]]
# ID Year V1
# 1: 1 2009 33
# 2: 1 2010 67
# 3: 1 2011 38
# 4: 4 2009 47
# 5: 4 2010 51
# 6: 4 2011 14
# short way
d2[Year%in%2009:2011][ID%in%unique(ID)[table(ID)==3]]
# ID Year V1
# 1: 1 2009 33
# 2: 1 2010 67
# 3: 1 2011 38
# 4: 4 2009 47
# 5: 4 2010 51
# 6: 4 2011 14
+1 Pour afficher un exemple minimal, la sortie attendue et le code que vous avez essayé, dans votre premier post sur vous!
Je suppose que vous vouliez dire "année" où vous avez écrit 'Anno'?
C'est vrai! C'est parce que la base de données d'origine provient de l'Espagne, nous avons donc dit "Año" = Anno, pour ne pas travailler dans R avec "ñ", mais le sens est l'année. Merci encore. C'est vrai! C'est parce que la base de données d'origine provient de l'Espagne, nous avons donc dit "Año" = Anno, pour ne pas travailler dans R avec "ñ", mais le sens est l'année. Merci encore.