-1
votes

Comment faire du regex pour correspondre à un numéro, puis multiplier le nombre en même temps pour une grande liste de R?

J'ai quelques données par exemple c ("1k", "2k", "1,5k" ...) , et voudrait TP transformer le KS sur C ("1000 "," 2000 "," 1500 ", ...) , gsub est assez rapide dans le remplacement d'une grande liste, mais il ne pourra pas correspondre au 1 ou 1.5 puis multipliez 1000 .

Je pourrais correspondre à (\ d + (. \ d {1})? [kk]) , (\ d + (. \ D + (. \ d + (22})? [kk])? / code>, (\ d + (. \ d + (. \ d {3})? [kk]) et remplacez-les, mais cela ressemble à une approche de force brute afin que j'aimerais voir y a-t-il d'autres moyens Je peux rapidement extraire le nombre, puis faire le calcul?

J'ai essayé d'extraire le numéro, puis de les multiplier puis de boucler dans la liste et de faire un GSub individuellement, mais c'est très lent.

Merci beaucoup.

Notez que les chaînes peuvent être '1k' , 'Prix d'affichage: 1k' , '1k - 2k' et d'autres aléatoires Caractères, etc. Nous voulons toujours obtenir le premier prix apparaît alors pour le boîtier 1k - 2k Nous voulons obtenir 1k . Et il y a aussi des millions de lignes afin que les performances puissent s'aggraver lorsque la substitution est effectuée plusieurs fois.

r etl

4 commentaires

Dupliquer possible? Stackoverflow.com/Questtions/56159114/...


Comment convertir-on "1k - 2k"? Quelle est la production attendue dans ce cas?


@JDOBRES, donc s'il y a 1k - 2k , nous voulons simplement obtenir le premier qui est 1k


Bonjour @TheLateMail, merci d'avoir souligné, il est similaire mais avec de légères différences, le prix viendra avec des caractères aléatoires avant et après le numéro de prix.


3 Réponses :


0
votes

Nous créons un vecteur , extraire la partie numérique et multiplie avec une partie non numérique remplacée xxx

données xxx


2 commentaires

Bonjour Akrun, merci pour le conseil, désolé d'avoir oublié de mentionner que les prix initiaux auront également des caractères aléatoires. Je pense que cela fonctionnera bien s'il n'y a pas d'autres personnages aléatoires autour du prix, malheureusement en raison de la qualité des données, il contient également d'autres caractères aléatoires.


Salut Akrun, désolé je me l'ai mis d'autres exemples, merci



1
votes

Pour supprimer les caractères aléatoires, cela supprime d'abord tous les caractères, à l'exception des chiffres, du point, de K et de K, puis remplace K ou K et tout par la suite avec E3. Enfin, il convertit ce qui reste à numérique.

x <- c("1k", "2k", "1.5k", "   6K", "1k - 2k")
as.numeric(sub("k.*", "e3", gsub("[^0-9.kK]", "", x), ignore.case = TRUE))
## [1] 1000 2000 1500 6000 1000


0 commentaires

0
votes
x = c("1k", "2k", "1.5k", "1k - 2k", "1m", "display price: 1k")
as.numeric(sub(".*(\\d+)k.*", "\\1", x)) * 1000
#[1] 1000 2000 5000 2000   NA 1000
#Warning message:
#NAs introduced by coercion 

2 commentaires

Salut @DB, merci pour le conseil, je l'ai essayé et cela a fonctionné dans la plupart des cas, mais pas de travail dans des cas comme 'Prix d'affichage: 1k' , existe-t-il des moyens de résoudre les caractères aléatoires avant et après le prix? Merci


Bonjour @ D.B, merci pour cela. J'ai copié ces deux lignes mais cela me donne la mauvaise réponse 1000 2000 5000 2000 NA 1000