You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:53:02