1
votes

Problème lors de la suppression des espaces d'une chaîne dans r

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

Exemple

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 = "")


9 commentaires

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é via utf8ToInt (Sueldos $ Sueldo [1]) )


4 Réponses :


1
votes

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>


6 commentaires

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



0
votes

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>


1 commentaires

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



1
votes

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 >

si vous préférez stringr:

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 =   ""))


0 commentaires

0
votes

Solution de base R (regex):

Sueldos$Sueldo <- gsub("\\s+", "", Sueldos$Sueldo)


0 commentaires