Sous-ensemble de données d'image basé sur le nombre de lignes par groupe
J'ai des données de ce genre, où certains "nom" produire plus de 3 fois:
df <- data.frame(name = c("a", "a", "a", "b", "b", "c", "c", "c", "c"), x = 1:9)
Je souhaite sous-ensemble (filtre) les données sont basées sur le nombre de lignes (observations) au sein de chaque niveau de la "nom de variable". Si un certain niveau de "nom" se produit plus que de dire 3 fois, je veux supprimer toutes les lignes appartenant à ce niveau.
J'ai écrit ce code, mais ne peut pas le faire fonctionner.
as.data.frame(table(unique(df)$name))
subset(df, name > 3)
OriginalL'auteur SJSU2013 | 2013-11-25
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, deux
base
alternatives. L'un s'appuie surtable
, et l'autre surave
etlength
. Ensuite, deuxdata.table
façons.1.
table
Si vous voulez marcher à travers étape par étape:
2.
ave
etlength
Comme suggéré par @flodel:
3.
data.table
:.N
et.SD
:4.
data.table
:.N
et.I
:Reportez-vous à la Q&Un Compter le nombre d'observations/nombre de lignes par groupe et ajouter le résultat à la trame de données.
df[ave(df$x, df$name, FUN = length) < 3, ]
Merci! Je suis d'accord, j'ai juste essayé de rester très simple et de construire sur ce que l'OP avait déjà tenté, parce qu'ils semblaient être un débutant
J'apprécie l'aide de tous. Henrik code du sens complet. Elle m'aide à comprendre R. Flodel du code est maintenant compréhensible après la lecture de Henrik.
En fait,
[.data.table
n'est pas appelée pour chaque groupe dansdf[, if (.N < 3) .SD, by = name]
. (Contrairement à la question que vous avez un lien où.SD
est en train d'être sous-ensemble). L'autre option ne semble pas être plus rapide. Test avecdf <- data.table(name = sample(1:1e6, 3e6, T), a = runif(30), b = runif(30), c = runif(30)); microbenchmark( df[, if (.N < 3) .SD, by = name], df[df[, .I[.N < 3], name]$V1] )
Merci pour le heads-up. Je vais modifier!
OriginalL'auteur Henrik
À l'aide de la
dplyr
package:OriginalL'auteur Joe