6
votes

Sous-ensemble un fichier de données par le montant de la répétition

Si j'ai un fichier de données comme celui-ci:

neu <- data.frame(test1 = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14), 
                  test2 = c("a","b","a","b","c","c","a","c","c","d","d","f","f","f"))
neu
   test1 test2
1      1     a
2      2     b
3      3     a
4      4     b
5      5     c
6      6     c
7      7     a
8      8     c
9      9     c
10    10     d
11    11     d
12    12     f
13    13     f
14    14     f

r

0 commentaires

4 Réponses :


7
votes

Trouver les lignes à l'aide de: xxx

ou: xxx

puis sous-ensemble avec: xxx

ou: xxx


8 commentaires

Thx qui a vraiment beaucoup aidé!


Pourquoi utiliser as.list ? Pourquoi deux table (.) ? Et il vaut mieux ne pas utiliser sous-ensemble .


Voir Stratégies alternatives ci-dessus.


@Arun, vous dérange-vous d'expliquer un peu ou de lier à une raison de votre suggestion de ne pas utiliser sous-ensemble . La chose à propos de sous-ensemble est qu'il est intuitivement nommé, il est donc plus naturel de penser "je vais sous-ensemble" plutôt que ", disons", je vais utiliser % dans % "ou" je vais à quel it ...


@PatrickT sous-ensemble utilise une évaluation non standard, il peut donc produire des résultats inattendus. Par exemple, si vous l'utilisez à l'intérieur d'une fonction, cela ne fonctionnera généralement pas correctement ou du tout. Meilleur conseil est d'utiliser [ pour toute extraction.


@Patrickt, à l'époque, j'étais probablement influencé par Cet article . Bien qu'il y ait des points valables là-bas, je ne vois pas une raison de ne pas utiliser, tant que vous savez ce que vous faites. J'ai tendance à éviter de suggérer "N'utilisez jamais cela / que" ces jours-ci.


Merci @Thomas, va essayer de vous rappeler cela.


Merci pour le lien @arun. Semble effrayant! Bonne question / réponse que vous avez liée à.



3
votes

J'utiliserais comptez code> à partir du package code> Plyr code> pour effectuer le comptage:

library(plyr)
count_result = count(neu, "test2")
matching = with(count_result, test2[freq > 3])
with(neu, test1[test2 %in% matching])
[1] 5 6 8 9


1 commentaires

Génial, merci beaucoup vous gars



5
votes

Voici un autre moyen:

 with(neu, neu[ave(seq(test2), test2, FUN=length) > 3, ])

#   test1 test2
# 5     5     c
# 6     6     c
# 8     8     c
# 9     9     c


1 commentaires

+1 C'est de loin la meilleure solution de base pour moi.



2
votes

la (meilleure mise à l'échelle) data.table code> WAY:

dt[, .SD[.N >= 3], by = test2]


0 commentaires