我知道这似乎是重复的,但是我已经尝试过针对此问题的几种解决方案,包括这个问题,也许我的刮擦出现问题会导致此问题
这就是我想要做的:
我从维基百科上抓取了这个数据集:
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)
数据集如下:
|Desde |Sueldo |
|:-----------------------|:------|
|1 de septiembre de 1987 |11 335 |
|1 de febrero de 1989 |15 488 |
|1 de junio de 1989 |18 000 |
|1 de junio de 1990 |26 000 |
|1 de junio de 1991 |33 000 |
|1 de junio de 1992 |38 600 |
|1 de junio de 1993 |46 000 |
|1 de junio de 1994 |52 150 |
|1 de junio de 1995 |58 900 |
|1 de junio de 1996 |65 500 |
我想在Sueldos中修剪空白以将其转换为数字,通常,修剪此空白没有问题,但是几次试验都得到了相同的结果:
我首先想到我会尝试使用 stringr
中的 str_remove_allSueldos <- Sueldos %>% str_remove_all(Sueldo, pattern = " ")
但是它没有改变
然后我想到了使用 str_replace_all
Sueldos <- Sueldos %>% mutate(Sueldo = str_replace_all(Sueldo, pattern = " ", replacement = ""))
没事
我想如果使用 fixed 可能会在上面的链接中找到
Sueldos <- Sueldos %>% mutate(Sueldo = str_replace_all(Sueldo, pattern = fixed(" "), replacement = ""))
没事
为了防万一,我终于尝试了gsub
Sueldos$Sueldo <- gsub(x = Sueldos$Sueldo, pattern = " ", replacement = "")
什么都没有,我不知道发生了什么
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
答案 0 :(得分:1)
通常,空白具有ascii 32,但是当我查看时,在Sueldo列中的字符是,数字之间的字符具有ascii160。我可以提供的一种解决方案是使用intToUtf8(160)替换该列。至于该数据中的ASCII分数160到底是多少,我不确定。
它可能被称为non breaking space,正如@WiktorStribiItew在下面指出的那样,我不确定此空格与空白之间的区别。
<?php
while ($row = mysqli_fetch_assoc($notice)) {
?>
<div class="panel-group" id="accordion6" role="tablist" aria-multiselectable="true">
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="headingOne6">
<h4 class="panel-title">
<a role="button" data-toggle="collapse" data-parent="#accordion6" href="#collapseOne6" aria-expanded="true" aria-controls="collapseOne6">
<?php echo $row['title']; ?>
</a>
</h4>
</div>
<div id="collapseOne6" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne6">
<div class="panel-body">
<?php echo $row['description']; ?>
</div>
</div>
</div>
</div>
<?PHP }?>
现在,如果我们gsub正确的字符:
sapply(unlist(strsplit(Sueldos$Sueldo[2],"")),utf8ToInt)
1 1 3 3 5
49 49 160 51 51 53
utf8ToInt(" ")
[1] 32
答案 1 :(得分:1)
@StupidWolf的答案对我有用,我想添加我的最终代码只是为了让喜欢它的人保持tidyverse格式:
git push
这很好用
将最后一行代码替换为:
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 = ""))
答案 2 :(得分:0)
当您在变量(而不是小标题)上使用str_replace_all
时,它会起作用:
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>
答案 3 :(得分:0)
Base R(正则表达式)解决方案:
Sueldos$Sueldo <- gsub("\\s+", "", Sueldos$Sueldo)