Rapide en remplaçant les valeurs dans dataframe dans la R
J'ai un dataframe de 150 000 lignes de 2 000 colonnes contenant des valeurs, certains étant négatifs.
Je suis le remplaçant ces valeurs négatives par 0, mais il est très lent pour le faire (~60min ou plus).
df[df < 0] = 0
où df[,1441:1453]
ressemble (toutes les colonnes/valeurs numériques):
V1441 V1442 V1443 V1444 V1445 V1446 V1447 V1448 V1449 V1450 V1451 V1452 V1453
1 3 1 0 4 4 -2 0 3 12 5 17 34 27
2 0 1 0 7 0 0 0 1 0 0 0 0 0
3 0 2 0 1 2 3 6 1 2 1 -6 3 1
4 1 2 3 6 1 2 1 -6 3 1 -4 1 0
5 1 2 1 -6 3 1 -4 1 0 0 1 0 0
6 1 0 0 1 0 0 0 0 0 0 1 2 2
Est-il un moyen pour accélérer le processus, par exemple, la façon dont je le fais c'est tout à fait lent, et il est plus rapide pour cette approche ?
Merci.
- De 150 000 lignes x 2000 colonnes : c'est correct
- Pouvez vous s'il vous plaît nous montrer la façon dont vos données ressemble? Sont toutes les colonnes numériques?
Vous devez vous connecter pour publier un commentaire.
Essayez de transformer votre df pour une matrice.
À la fois votre approche originale et la réponse actuelle de créer un objet de la même taille que
m
(oudf
) lors de la création dem<0
(la méthode de la matrice est plus rapide, car il y a moins de copie interne avec[<-
comparé avec[<-.data.frame
Vous pouvez utiliser
lapply
etreplace
, alors vous êtes seulement à la recherche à un vecteur oulength (nrow(df))
à chaque foiset ne copie pas tellement
Le code ci-dessus devrait être assez effiicent.
Si vous utilisez
data.table
, la plupart de la mémoire (et) le temps de l'inefficacité de ladata.frame
approche est supprimé. Il serait idéal pour un ensemble important de données situation comme la vôtre.Vous pouvez définir les touches sur toutes les colonnes et ensuite remplacer par référence à des valeurs de clé inférieure à 0
Un autre des données.table de réponse, peut-être plus rapide, et vraiment devrait consommer moins de mémoire.
.j
symbole utilisé dansi
argument est répété et remplacées par les colonnes dej
argument.