2010-10-12 3 views
4
cadre

avec 10 lignes et 3 colonnesen utilisant R - supprimer des lignes quand une valeur répétée moins de 3 fois

a b c 
1 1 201 1 
2 2 202 1 
3 3 203 1 
4 4 204 1 
5 5 205 4 
6 6 206 5 
7 7 207 4 
8 8 208 4 
9 9 209 8 
10 10 210 5 

Je veux supprimer toutes les lignes où la même valeur dans la colonne « c » répété à moins de 3 fois. Dans cet exemple je veux supprimer les lignes 6, 9 et 10. (mon vrai data.frame a 5000 lignes et 25 cols) J'ai essayé de le faire en utilisant la fonction rle, mais je continue à obtenir la mauvaise solution. toute aide? Merci!

Répondre

4

Corrigez-moi si je me trompe, mais il semble que vous voulez toutes les lignes où la valeur dans la colonne c se produit plus de deux fois. "Répété" me fait penser qu'ils doivent se produire consécutivement, ce qui est pour rle, mais vous ne voudriez que les lignes 1-4 si c'était ce que vous essayiez de faire. Cela dit, le code ci-dessous trouve les lignes où la valeur dans la colonne c se produit plus de 2 fois. Je suis sûr que cela peut être fait plus élégamment, mais cela fonctionne.

lines <- 
"a b c 
1 201 1 
2 202 1 
3 203 1 
4 204 1 
5 205 4 
6 206 5 
7 207 4 
8 208 4 
9 209 8 
10 210 5" 
Data <- read.table(con <- textConnection(lines), header=TRUE); close(con) 
cVals <- data.frame(table(Data$c)) 
Rows <- Data$c %in% cVals[cVals$Freq > 2,1] 
Data[Rows,] 
# a b c 
#1 1 201 1 
#2 2 202 1 
#3 3 203 1 
#4 4 204 1 
#5 5 205 4 
#7 7 207 4 
#8 8 208 4 
+0

ans ... c'était le problème principal avec rle ... merci! – Claudia

9

bâtiment sur Joshua's answer:

Data[Data$c %in% names(which(table(Data$c) > 2)), ] 
+0

wow ... merci! ... – Claudia

1

L'utilisation unsplit est probablement la meilleure façon de projeter un agrégat groupé (dans ce cas, en utilisant le tableau pour obtenir compte, mais voir tapply pour le cas général) vers les données d'origine.

subset(Data, with(Data, unsplit(table(c), c)) >= 3) 

et plus Équivalemment semblable à Erik:

Data[unsplit(table(Data$c), Data$c) >= 3, ] 
1

Voici une solution en utilisant ave:

Data[ave(Data$c, Data$c, FUN = length) > 2, ] 

ou en utilisant ave avec subset:

subset(Data, ave(c, c, FUN = length) > 2) 
Questions connexes