2016-06-15 4 views
3

Je souhaite subdiviser ma base de données pour ne conserver que les groupes ayant 3 observations ou plus sur DIFFERENTS jours. Je veux me débarrasser des groupes qui ont moins de trois observations ou dont les observations ne datent pas de trois jours différents.Supprimer des groupes avec moins de trois observations uniques

Voici un ensemble d'échantillons de données:

Group Day 
1  1 
1  3 
1  5 
1  5 
2  2 
2  2 
2  4 
2  4 
3  1 
3  2 
3  3 
4  1 
4  5 

Pour l'exemple ci-dessus, le groupe 1 et le groupe 3 seront conservés et le groupe 2 et 4 seront retirés de la trame de données. J'espère que cela a du sens, j'imagine que la solution sera assez simple, mais je ne peux pas la résoudre (je suis assez nouveau à R et pas très rapide à venir avec des solutions à des choses comme ça). J'ai pensé que peut-être la fonction de diff pourrait être utile mais n'a pas été beaucoup plus loin, et je n'ai pas eu de chance de chercher des réponses aux questions existantes sur SO et d'autres sites web.

Merci beaucoup d'avance!

+0

Essayez 'df [df Group $% en% as.numeric (noms (tapply (df $ Day, df $ Groupe, fonction (x) length (unique (x))> = 3)))),] ' – nicola

Répondre

6

Avec data.table vous pouvez faire:

library(data.table) 
DT[, if(uniqueN(Day) >= 3) .SD, by = Group] 

qui donne:

Group Day 
1:  1 1 
2:  1 3 
3:  1 5 
4:  1 5 
5:  3 1 
6:  3 2 
7:  3 3 

Ou avec dplyr:

library(dplyr) 
DT %>% 
    group_by(Group) %>% 
    filter(n_distinct(Day) >= 3) 

qui donne le même résultat.

5

Une idée en utilisant dplyr

library(dplyr) 
df %>% 
    group_by(Group) %>% 
    filter(length(unique(Day)) >= 3) 

#Source: local data frame [7 x 2] 
#Groups: Group [2] 

# Group Day 
# (int) (int) 
#1  1  1 
#2  1  3 
#3  1  5 
#4  1  5 
#5  3  1 
#6  3  2 
#7  3  3 
+2

instea d de 'longueur (unique (Jour))' vous pourriez vous 'n_distinct (jour)' – theArun

+0

Nice one! Merci @Arun – Sotos

+0

'n_distinct (jour)' était déjà dans ma réponse ...... – Jaap

4

Nous pouvons utiliser base R

i1 <- rowSums(table(df1)!=0)>=3 
subset(df1, Group %in% names(i1)[i1]) 
# Group Day 
#1  1 1 
#2  1 3 
#3  1 5 
#4  1 5 
#9  3 1 
#10  3 2 
#11  3 3 

Ou un base R one-liner serait

df1[with(df1, as.logical(ave(Day, Group, FUN = function(x) length(unique(x)) >=3))),]