7
votes

Sous-ensemble par plusieurs conditions

Peut-être que c'est quelque chose de base, mais je ne pouvais pas trouver la réponse.
J'ai xxx pré>

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>

d1_3 <- subset(d1, Year==2009 |Year==2010 |Year==2011 )


3 commentaires

+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.


4 Réponses :


2
votes

Cela devrait faire le travail :)

library(plyr)
ds<-ddply(ds,.(Id),mutate,Nobs=length(Year))
ds[ds$Nobs == 3 & ds$Year %in% 2009:2011,]


4 commentaires

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.



4
votes

Je pense que Ave 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 ). Cela donne un vecteur logique, qui peut être somme 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. xxx


4 commentaires

+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 à 2009: 2011% en% x . Comparez par exemple C (2009, 2009, 2009)% en% 2009: 2011 et 2009: 2011% en% C (2009, 2009, 2009)


@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) est 3, malgré toutes les années ne sont pas représentées. C'est pourquoi je les échangeais.



2
votes

Une autre façon d'utiliser Ave xxx


0 commentaires

1
votes

Je pense qu'une approche utilisant 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>.

Encore une fois, je viens de le jeter là pour fournir des options à utiliser différents Aspects de la langue. P>

# 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


0 commentaires