Je sais que cela semble être un doublon, mais j'ai essayé plusieurs solutions à ce problème, y compris celle-ci, peut-être ai-je un problème avec mon grattage qui produit ce problème
Voici ce que J'essaie de faire:
J'ai récupéré cet ensemble de données de Wikipédia:
R version 3.6.1 (2019-07-05) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Ubuntu 18.04.3 LTS Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1 locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=es_CL.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=es_CL.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=es_CL.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=es_CL.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] forcats_0.4.0 stringr_1.4.0 dplyr_0.8.3 purrr_0.3.3 readr_1.3.1 tidyr_1.0.0 tibble_2.1.3 [8] ggplot2_3.2.1 tidyverse_1.2.1 rvest_0.3.4 xml2_1.2.2 loaded via a namespace (and not attached): [1] tidyselect_0.2.5 xfun_0.10 haven_2.1.1 lattice_0.20-38 colorspace_1.4-1 vctrs_0.2.0 generics_0.0.2 [8] htmltools_0.4.0 yaml_2.2.0 rlang_0.4.1 pillar_1.4.2 glue_1.3.1 withr_2.1.2 selectr_0.4-1 [15] modelr_0.1.5 readxl_1.3.1 lifecycle_0.1.0 munsell_0.5.0 gtable_0.3.0 cellranger_1.1.0 htmlwidgets_1.5.1 [22] evaluate_0.14 knitr_1.25 curl_4.2 highr_0.8 htmlTable_1.13.2 broom_0.5.2 Rcpp_1.0.2 [29] scales_1.0.0 backports_1.1.5 checkmate_1.9.4 jsonlite_1.6 hms_0.5.1 digest_0.6.22 stringi_1.4.3 [36] grid_3.6.1 cli_1.1.0 tools_3.6.1 magrittr_1.5 lazyeval_0.2.2 crayon_1.3.4 pkgconfig_2.0.3 [43] zeallot_0.1.0 lubridate_1.7.4 assertthat_0.2.1 rmarkdown_1.16 httr_1.4.1 rstudioapi_0.10 R6_2.4.0 [50] nlme_3.1-141 compiler_3.6.1
L'ensemble de données ressemble à ceci:
Sueldos$Sueldo <- gsub(x = Sueldos$Sueldo, pattern = " ", replacement = "")
4 Réponses :
Normalement un espace blanc a ascii 32, mais quand je regarde en dessous se trouve le caractère dans la colonne Sueldo, le caractère entre les nombres a ascii 160. Une solution que je peux offrir est de remplacer la colonne en utilisant intToUtf8 (160). Quant à savoir quel est exactement le score ascii 160 dans ces données, je ne suis pas sûr.
Il pourrait être appelé espace insécable , comme @ WiktorStribiżew l'a souligné ci-dessous, Je ne suis pas sûr de la distinction entre ceci et l'espace blanc.
gsub(intToUtf8(160),"",Sueldos$Sueldo) [1] "11335" "15488" "18000" "26000" "33000" "38600" [7] "46000" "52150" "58900" "65500" "71400" "80500" [13] "90500" "100000" "105500" "111200" "115648" "120000" [19] "127500" "135000" "144000" "159000" "165000" "172000" [25] "182000" "193000" "210000" "225000" "241000" "250000" [31] "257500" "264000" "270000" "276000" "288000[1]" "301000[2]"
Maintenant, si nous gsub le caractère correct:
sapply(unlist(strsplit(Sueldos$Sueldo[2],"")),utf8ToInt) 1 1 Â 3 3 5 49 49 160 51 51 53 utf8ToInt(" ") [1] 32
p>
Comment se fait-il qu'un espace insécable ne soit pas un espace blanc?
Je n'ai aucune idée de @ WiktorStribiżew, j'ai pris les données et j'ai vu qu'il y avait ascii 160. Et si vous remplacez cela, cela fonctionne. Pourquoi le vote négatif?
Parce qu'un espace insécable est un espace blanc. Il est même appelé: espace insécable.
Malheur, @StupidWolf ça marche vraiment, je choisirai ta réponse dans une minute
Merci! Ouais, je rencontre toujours des personnages bizarres, et je vérifie le score ascii pour le savoir.
Trucs bizarres que quelqu'un a critiqué votre réponse, je ne sais pas pourquoi @StupidWolf
Cela fonctionne lorsque vous utilisez str_replace_all
sur une variable (et non sur le tibble):
suppressPackageStartupMessages(library(dplyr)) suppressPackageStartupMessages(library(rvest)) Sueldos <- read_html("https://es.wikipedia.org/wiki/Anexo:Salario_m%C3%ADnimo_en_Chile") %>% html_nodes(".wikitable") Sueldos <-rvest::html_table(Sueldos[[1]]) colnames(Sueldos) <- make.names(colnames(Sueldos)) Sueldos <- Sueldos %>% rename(Sueldo = Monto.bruto.enpesos.chilenos) %>% dplyr::select(Desde, Sueldo) # test <- Sueldos$Desde[1] # test %>% # stringr::str_remove_all(string = ., pattern = " ") Sueldos %>% mutate(Desde = Desde %>% stringr::str_remove_all(string = ., pattern = " ")) #> Desde Sueldo #> 1 1deseptiembrede1987 11Â 335 #> 2 1defebrerode1989 15Â 488 #> 3 1dejuniode1989 18Â 000 #> 4 1dejuniode1990 26Â 000 #> 5 1dejuniode1991 33Â 000 #> 6 1dejuniode1992 38Â 600 #> 7 1dejuniode1993 46Â 000 #> 8 1dejuniode1994 52Â 150 #> 9 1dejuniode1995 58Â 900 #> 10 1dejuniode1996 65Â 500 #> 11 1dejuniode1997 71Â 400 #> 12 1dejuniode1998 80Â 500 #> 13 1dejuniode1999 90Â 500 #> 14 1dejuniode2000 100Â 000 #> 15 1dejuniode2001 105Â 500 #> 16 1dejuniode2002 111Â 200 #> 17 1dejuliode2003 115Â 648 #> 18 1dejuliode2004 120Â 000 #> 19 1dejuliode2005 127Â 500 #> 20 1dejuliode2006 135Â 000 #> 21 1dejuliode2007 144Â 000 #> 22 1dejuliode2008 159Â 000 #> 23 1dejuliode2009 165Â 000 #> 24 1dejuliode2010 172Â 000 #> 25 1dejuliode2011 182Â 000 #> 26 1dejuliode2012 193Â 000 #> 27 1deagostode2013 210Â 000 #> 28 1dejuliode2014 225Â 000 #> 29 1dejuliode2015 241Â 000 #> 30 1deenerode2016 250Â 000 #> 31 1dejuliode2016 257Â 500 #> 32 1deenerode2017 264Â 000 #> 33 1dejuliode2017 270Â 000 #> 34 1deenerode2018 276Â 000 #> 35 1deseptiembrede2018 288Â 000[1]<U+200B> #> 36 1demarzode2019 301Â 000[2]<U+200B>
Le résultat dans celui-ci contient toujours des espaces entre les nombres, votre solution a extrait l'espace blanc du Desde, et non la variable sueldo
La réponse de @StupidWolf a fonctionné pour moi, je voulais ajouter ce que mon code final était juste pour garder le format tidyverse pour quiconque aime mieux ça:
Sueldos <- Sueldos %>% rename(Sueldo = Monto.bruto.enpesos.chilenos) %>% dplyr::select(Desde, Sueldo) %>% mutate(Desde = lubridate::dmy(Desde), Sueldo = str_remove_all(Sueldo, pattern = intToUtf8(160)))
Cela fonctionne très bien p >
remplacez la dernière ligne de code par:
library(rvest) library(tidyverse) Sueldos <- read_html("https://es.wikipedia.org/wiki/Anexo:Salario_m%C3%ADnimo_en_Chile") %>% html_nodes(".wikitable") Sueldos <-rvest::html_table(Sueldos[[1]]) colnames(Sueldos) <- make.names(colnames(Sueldos)) Sueldos <- Sueldos %>% rename(Sueldo = Monto.bruto.enpesos.chilenos) %>% dplyr::select(Desde, Sueldo) %>% mutate(Desde = lubridate::dmy(Desde), Sueldo = gsub(x = Sueldo, pattern = intToUtf8(160),replacement = ""))
Solution de base R (regex):
Sueldos$Sueldo <- gsub("\\s+", "", Sueldos$Sueldo)
Qu'en est-il des
trimws
? Bien que vos tentatives précédentes aient échoué, je doute que cela fonctionnera ... mais cela vaut la peine d'essayer ... À moins que vous ne souhaitiez supprimer tous les espaces (pas seulement au début / à la fin)Merci @Sotos, je veux supprimer tous les espaces, car je veux transformer cette colonne en un ensemble de données numériques
Je ne peux pas reproduire votre ensemble de données (problèmes de proxy, etc.) Pouvez-vous partager un exemple reproductible via
dput ()
?Est-il possible que vous souhaitiez supprimer un autre caractère que l'espace blanc?
Peut-être @cbo, j'y ai pensé, mais comme cela ressemble à un espace, je ne sais pas quel caractère utiliser à la place
Pourriez-vous partager vos données avec un
dput (Sueldos)
?Si vous souhaitez supprimer les espaces et pas seulement les blancs, utilisez
\\ s
Utilisez
Sueldos $ Sueldo <- gsub ("(* UCP) \\ s +", "", Sueldos $ Sueldo, perl = TRUE)
pour supprimer tous les espaces dans la table Unicode. Si le texte reste tel quel, ce que vous souhaitez supprimer n'est pas un espace.L'espace à supprimer est
intToUtf8 (160)
(trouvé viautf8ToInt (Sueldos $ Sueldo [1])
)