R: Remplacer les multiples valeurs de plusieurs colonnes de dataframes avec NA
Je suis en train de réaliser quelque chose de similaire à cette question mais avec plusieurs valeurs qui doivent être remplacés par de NA, et dans le grand jeu de données.
df <- data.frame(name = rep(letters[1:3], each = 3), foo=rep(1:9),var1 = rep(1:9), var2 = rep(3:5, each = 3))
qui génère cette dataframe:
df
name foo var1 var2
1 a 1 1 3
2 a 2 2 3
3 a 3 3 3
4 b 4 4 4
5 b 5 5 4
6 b 6 6 4
7 c 7 7 5
8 c 8 8 5
9 c 9 9 5
Je voudrais remplacer toutes les occurrences de, disons, 3 et 4 par NA, mais seulement dans les colonnes qui commencent par "var".
Je sais que je peux utiliser une combinaison de []
opérateurs pour obtenir le résultat que je veux:
df[,grep("^var[:alnum:]?",colnames(df))][
df[,grep("^var[:alnum:]?",colnames(df))] == 3 |
df[,grep("^var[:alnum:]?",colnames(df))] == 4
] <- NA
df
name foo var1 var2
1 a 1 1 NA
2 a 2 2 NA
3 a 3 NA NA
4 b 4 NA NA
5 b 5 5 NA
6 b 6 6 NA
7 c 7 7 5
8 c 8 8 5
9 c 9 9 5
Maintenant mes questions sont les suivantes:
- Est-il un moyen de le faire de manière efficace, étant donné que mon réel
jeu de données d'environ 100.000 lignes, et de 400 à 500 variables commencent
avec "var". Il me semble (subjectivement) lent sur mon ordinateur lorsque j'utilise
les deux crochets de la technique. - Comment pourrais-je aborder le problème si
au lieu de 2 valeurs (3 et 4) pour être remplacé par NA, j'ai eu une longue
liste de, disons, 100 valeurs différentes? Est-il un moyen de spécifier plusieurs valeurs avec le fait de devoir faire un maladroit série de conditions séparés par|
opérateur?
Vous pouvez utiliser
%in%
.OriginalL'auteur Peutch | 2014-09-10
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également le faire à l'aide de
replace
:Rapide analyse comparative à l'aide d'un million de lignes de l'échantillon de données suggère que c'est plus rapide que les autres réponses.
Sur mes données, je suis allé à partir de 17 secondes à 1,8 secondes, une dizaine de fois en baisse par rapport à @akrun méthode! Merci!
J'ai ajouté des critères de référence à ma réponse.
Aucune idée si c'est possible de compter le nombre de valeurs ont été modifiées?
OriginalL'auteur thelatemail
Vous pouvez aussi faire:
sapply
méthode.Je pense que j'ai pressé une fraction plus de vitesse de ce avec
replace
- pourriez-vous tester sur vos données?OriginalL'auteur akrun
je n'ai pas chronométré cette option, maisj'ai écrit une fonction appeléemakemeNA
qui fait partie de mon GitHub seulement "SOfun" package.Avec cette fonction, l'approche serait quelque chose comme ceci:
La fonction utilise la
na.strings
argument entype.convert
de faire la conversion enNA
.Installer le package avec:
(ou de votre méthode préférée de l'installation des packages à partir de GitHub).
Voici une partie de l'analyse comparative. J'ai décidé de rendre les choses intéressantes et de remplacer à la fois numériques et non-valeurs numériques avec
NA
pour voir comment les choses se comparer.Voici les données de l'échantillon:
Voici les fonctions de test:
Je suis en rupture de sortir
fun2
etfun3
. Je ne suis pas fou au sujet defun2
, car il convertit tout de même type. J'attends aussi defun3
plus lente.Alors maintenant, il vient vers moi et Thela...
Dang vous Thela!
numeric
colonnes pour comparerOriginalL'auteur A5C1D2H2I1M1N2O1R2T1
Voici une approche:
OriginalL'auteur Sven Hohenstein
Ici est un dplyr solution:
OriginalL'auteur Tomiris