从r中的字符串中删除空白时出现问题

从r中的字符串中删除空白时出现问题,r,string,gsub,stringr,R,String,Gsub,Stringr,我知道这看起来像是重复的,但我已经尝试了几种解决这个问题的方法,包括这一种,也许我的刮削有问题,导致了这个问题 例子 这就是我想做的: 我从维基百科抓取了这个数据集: library(tidyverse) library(rvest) Sueldos <- read_html("https://es.wikipedia.org/wiki/Anexo:Salario_m%C3%ADnimo_en_Chile") %>% html_nodes(".wikitable") Sueld

我知道这看起来像是重复的,但我已经尝试了几种解决这个问题的方法,包括这一种,也许我的刮削有问题,导致了这个问题

例子 这就是我想做的:

我从维基百科抓取了这个数据集:

library(tidyverse)
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)
我想删减Sueldos中的空白,将其转换为数字,通常情况下,删减空白没有问题,但几次试验都给出了相同的结果:

测试1 我首先想到我会尝试用str_从stringr中删除所有内容


通常一个空格有ascii 32,但当我在下面看到Sueldo列中的字符时,数字之间的字符有ascii 160。我可以提供的一个解决方案是使用intToUtf8(160)替换列。至于这个数据中的ascii分数160到底是多少,我不确定

正如@WiktorStribiżew在下面指出的那样,它可能被称为,我不确定这和空白之间的区别

sapply(unlist(strsplit(Sueldos$Sueldo[2],"")),utf8ToInt)
  1   1       3   3   5 
 49  49 160  51  51  53

utf8ToInt(" ")
[1] 32
现在,如果我们使用正确的字符:

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]"

当您对变量(而不是TIBLE)使用
str\u replace\u all
时,它会起作用:

SuppressPackageStatupMessages(库(dplyr))
SuppressPackageStatupMessages(库(rvest))
Sueldos%html\u节点(“.wikitable”)
苏埃尔多斯%
突变(Desde=Desde%>%stringr::str_remove_all(string=,pattern=”“))
#>德斯德苏埃尔多酒店
#>1教育部1987 11 335
#>2 1989年12月15日488
#>3德尤尼奥德1989 18 000
#>4 Dejunode1990 26 000
#>5德尤尼奥德1991 33000
#>6 Dejunode1992 38 600
#>7德尤尼奥德1993 46 000
#>8 Ejunode1994 52 150
#>9 Dejunode1995 58 900
#>10 Dejunode1996 65 500
#>11 Dejunode1997 71 400
#>12 Dejunode1998 80 500
#>13 Dejunode1999 90 500
#>14德尤尼奥德2000 100 000
#>15迪尤诺德2001 105 500
#>16德国2002 111 200
#>17德国2003 115 648
#>18德国2004年12万
#>19德国法典2005 127 500
#>20 1dejuliode2006 135 000
#>21 1德国2007 144 000
#>22 1德国2008 159000
#>23 1dejuliode2009 165 000
#>24 1德国2010 172000
#>25 1德国2011 182 000
#>26 1德国2012 193 000
#>2013年10月27日210 000
#>28 1德国2014 225 000
#>29 1dejuliode2015 241 000
#>2016年12月30日250000
#>31德国2016 257 500
#>32.1 2017年12月26.4万
#>33 2017年1月1日27万
#>34 2018年12月276000
#>35 1deseptiembrede2018 288 000[1]
#>36德马尔佐德2019 301 000[2]

关于@StupidWolf的答案对我很有用,我想添加我的最终代码,只是为了让更喜欢它的人保留tidyverse格式:

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 =   ""))
库(rvest)
图书馆(tidyverse)
Sueldos%html\u节点(“.wikitable”)
Sueldo%突变(Desde=lubridate::dmy(Desde),Sueldo=gsub(x=Sueldo,pattern=intToUtf8(160),replacement=”“)
这很有效

如果您喜欢stringr: 将最后一行代码替换为:

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)))
Sueldo%rename(Sueldo=Monto.bruto.enpesos.chilenos)%%>%dplyr::select(Desde,Sueldo)%%>%mutate(Desde=lubridate::dmy(Desde),Sueldo=str_remove_all(Sueldo,pattern=intToUtf8(160)))
基本R(正则表达式)解决方案:

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

Sueldos$Sueldo如何
trimws
?虽然考虑到你以前的尝试失败了,我怀疑这会奏效…但值得一试。。。除非您想删除所有空白(不仅仅是前导/尾随),谢谢@Sotos,否则我确实想删除所有空白,因为我想将该列转换为数字数据。我无法复制您的数据集(代理问题等)。您能通过
dput()分享一个可复制的示例吗
?是否可能是要删除的空白以外的字符?要删除的空白是
intToUtf8(160)
(通过
utf8ToInt(Sueldos$Sueldo[1])
)为什么不间断的空白不是空白?我不知道@WiktorStribiżew,我拿了数据,看到它有ascii 160。如果你换掉它,它就会工作。为什么要投否决票?因为一个不间断的空格就是空白。它甚至被称为:不间断的空间。悲哀,@StupidWolf这确实有效,我会在一分钟内选择你的答案!是的,我经常遇到奇怪的字符,我检查ascii分数来找出答案。结果中的数字中间仍然有空格,你的解决方案得到的是Desde中的空格,而不是sueldo变量
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   
sapply(unlist(strsplit(Sueldos$Sueldo[2],"")),utf8ToInt)
  1   1       3   3   5 
 49  49 160  51  51  53

utf8ToInt(" ")
[1] 32
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]"
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 =   ""))
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)))
Sueldos$Sueldo <- gsub("\\s+", "", Sueldos$Sueldo)