如何解决R语言读取网站数据为字符型而非数值型的问题
解决R中读取地震数据列类型为Character而非Numeric的问题
你的问题大概率是因为网页返回的文本里,数值可能用逗号作为小数点分隔符,或是读取固定宽度文件时表头行的格式干扰了数据类型识别。咱们可以通过以下几种方式搞定:
方法一:用dplyr批量转换指定列
在你现有的数据处理管道末尾,直接添加类型转换步骤就行,用dplyr的mutate_at能批量处理多列:
library(rvest) library(dplyr) widths <- c(11,10,10,10,14,5,5,5,48,100) dat <- "http://www.koeri.boun.edu.tr/scripts/lst5.asp" %>% read_html %>% html_nodes("pre") %>% html_text %>% textConnection %>% read.fwf(widths = widths, stringsAsFactors = FALSE) %>% setNames(nm = .[6,]) %>% tail(-7) %>% head(-2) %>% # 转换指定列到数值型,可按需添加其他列 mutate_at(vars(`Enlem(N)`, `Boylam(E)`), ~ as.numeric(gsub(",", ".", .)))
小说明:
- 如果数据里的小数点是逗号(欧洲地区常用格式),
gsub(",", ".", .)会先把逗号替换成点,再转成数值;就算本来就是点,这一步也不会搞坏数据。 vars()里可以把所有需要转数值的列都列进去,比如震级、深度这类列,直接加在后面就行。
方法二:Base R原生方式转换
要是你不想加载dplyr,用Base R也能轻松处理:
# 先定义需要转换的列名 cols_to_convert <- c("Enlem(N)", "Boylam(E)") # 循环转换每一列 dat[cols_to_convert] <- lapply(dat[cols_to_convert], function(x) { as.numeric(gsub(",", ".", x)) })
额外小提示
- 转换前可以先查下数据内容:用
head(dat$Enlem(N))看看列里具体是什么,确认有没有多余的空格、单位符号这类干扰项,有的话可以在gsub里一起清理掉。 - 如果转换后出现
NA,说明有些行的内容没法转成数值,用which(is.na(dat$Enlem(N)))就能定位这些异常行,针对性处理就行。
内容的提问来源于stack exchange,提问作者melik
相关产品推荐
相关产品推荐

