R 数据处理 —— 常见文件处理

下面,我们就讲讲如何用 R 来读取读取常见数据格式文件的方式。

1、txt/csv 格式文件
read.table(file, header = FALSE, sep = "", quote = "\"'",
           dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
           row.names, col.names, as.is = !stringsAsFactors,
           na.strings = "NA", colClasses = NA, nrows = -1,
           skip = 0, check.names = TRUE, fill = !blank.lines.skip,
           strip.white = FALSE, blank.lines.skip = TRUE,
           comment.char = "#",
           allowEscapes = FALSE, flush = FALSE,
           stringsAsFactors = default.stringsAsFactors(),
           fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)

read.csv(file, header = TRUE, sep = ",", quote = "\"",
         dec = ".", fill = TRUE, comment.char = "", ...)

read.csv2(file, header = TRUE, sep = ";", quote = "\"",
          dec = ",", fill = TRUE, comment.char = "", ...)

read.delim(file, header = TRUE, sep = "\t", quote = "\"",
           dec = ".", fill = TRUE, comment.char = "", ...)

read.delim2(file, header = TRUE, sep = "\t", quote = "\"",
            dec = ",", fill = TRUE, comment.char = "", ...)

上面 5 个函数都可以用于读取表格格式文件。

read.csvread.csv2 相较于 read.table,除了几个默认参数值不同外,其他参数都是完全一样的。

  • read.table : sep 指定的默认分隔符为一个或多个空格,制表符、换行或回车,dec 指定的小数点以 . 分隔
  • read.csv : 读取 , 分隔符文件
  • read.csv2 : 读取 ; 分隔符文件,且小数点以 , 分隔
  • read.delim : 读取 \t 分隔符文件
  • read.delim2 : 读取 \t 分隔符文件,且小数点以 , 分隔
示例
> read.table('Downloads/data.txt')
           V1  V2        V3        V4
1 segdup01284 hs3 111883743 111884767
2 segdup02286 hs1 152617218 152618252
3 segdup02286 hs3 111883745 111884756
4 segdup02365 hs1 158502674 158503718
5 segdup02365 hs3 111883744 111884768
6 segdup02574 hs1 199147461 199151487
7 segdup02574 hs3 113384907 113387537
8 segdup02968 hs1 235049483 235050522
9 segdup02968 hs3 111883744 111884768
写出文件
write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
            eol = "\n", na = "NA", dec = ".", row.names = TRUE,
            col.names = TRUE, qmethod = c("escape", "double"),
            fileEncoding = "")

write.csv(...)
write.csv2(...)

写出文件的函数与读取函数相对应

2. 读取 json 数据

这里我们使用 rjson 模块

2.1 安装
install.packages("rjson")
2.2 使用

数据

[
  {
  "Name": "Mario",
  "Age": 32,
  "Occupation": "Plumber",
  "Rank": 3
  },
  {
  "Name": "Peach",
  "Age": 21,
  "Occupation": "Princess",
  "Rank": 1
  }
]

读取

# 导入模块
library(rjson)

# 读取数据
data <- fromJSON(file = 'Downloads/data.json')

# 查看数据格式
# > str(data)
# List of 2
# $ :List of 4
# ..$ Name      : chr "Mario"
# ..$ Age       : num 32
# ..$ Occupation: chr "Plumber"
# ..$ Rank      : num 3
# $ :List of 4
# ..$ Name      : chr "Peach"
# ..$ Age       : num 21
# ..$ Occupation: chr "Princess"
# ..$ Rank      : num 1

可以看到,json 数据被转换为嵌套的 list

知道怎么读取 json 数据了,那如何写出成 json 格式的文件呢?

例如,我们想更改 Mario 的年龄为 45,并将 Peach 的等级改为 9

data[[1]]$Age <- 45
data[[2]]$Rank <- 9

# 转换为 json string
outJson <- toJSON(data)
# 保存为 new_data.json
write(outJson, file = "Downloads/new_data.json")

new_data.json

[
  {
  "Name": "Mario",
  "Age": 45,
  "Occupation": "Plumber",
  "Rank": 3
  },
  {
  "Name": "Peach",
  "Age": 21,
  "Occupation": "Princess",
  "Rank": 9
  }
]
3. xml 文件操作

我们以 KEGG 通路 hsa05130kgml 文件为例

# 安装模块
install.packages("XML")
# 导入模块
library(XML)
# 解析 xml 文件
hsa <- xmlParse("Downloads/hsa05130.xml")
# 提取根节点
oot <- xmlRoot(hsa)
# 查看根节点名称
xmlName(root)
# [1] "pathway"
# 查看根节点的子节点数目
xmlSize(root)
# [1] 293
# 查看第一个子节点
root[[1]]
# <entry id="4" name="path:hsa04810" type="map" link="https://www.kegg.jp/dbget-bin/www_bget?hsa04810">
#   <graphics name="Regulation of actin cytoskeleton" fgcolor="#000000" bgcolor="#FFFFFF" type="roundrectangle" x="1237" y="777" width="119" height="34"/>
#   </entry>

root[[1]][[1]]  # 查看第一个子节点的第一个子节点
# <graphics name="Regulation of actin cytoskeleton" fgcolor="#000000" bgcolor="#FFFFFF" type="roundrectangle" x="1237" y="777" width="119" height="34"/> 

xmlSApply(root, xmlName)  # 根节点的所有子节点名称
xmlSApply(root[[1]], xmlAttrs)  # 子节点 1 的所有子节点属性
# graphics                          
# name    "Regulation of actin cytoskeleton"
# fgcolor "#000000"                         
# bgcolor "#FFFFFF"                         
# type    "roundrectangle"                  
# x       "1237"                            
# y       "777"                             
# width   "119"                             
# height  "34" 
xmlSApply(root, xmlSize)  # 所有子节点大小

# xpath 语法获取节点属性 id=4 的 entry
getNodeSet(root, "//entry[@id=4]")
# [[1]]
# <entry id="4" name="path:hsa04810" type="map" link="https://www.kegg.jp/dbget-bin/www_bget?hsa04810">
#   <graphics name="Regulation of actin cytoskeleton" fgcolor="#000000" bgcolor="#FFFFFF" type="roundrectangle" x="1237" y="777" width="119" height="34"/>
#   </entry> 
#   
#   attr(,"class")
# [1] "XMLNodeSet"
# 转换为 list ,转换为 dataframe 可以用 xmlToDataFrame
hsa_list <- xmlToList(root)
# 更改数据
root[[1]][[1]] <- "haha"
# 保存
saveXML(root, file="hsa05130.xml",encoding="UTF-8")
4. 网页文件
4.1 安装包

R 中,我们使用 rvest 模块,进行网页解析以及获取网页内容。

# install "rvest" package
install.packages("rvest")
# library 
library(rvest)
4.2 解析网页

我们还是以昨天的链接为例

首先用 read_html 读取网页链接

然后用 html_text 读取整个网页内容,返回的是一个字符串

# 网页链接
URL <- "http://rest.kegg.jp/get/cpd:C01290"
# 获取 URL 网页
res <- read_html(URL)
# 读取网页文本
text <- html_text(res)
4.3 提取内容
# 将文本按行分割
# strsplit 返回的是长度为 1 的 list,因此,可以用 unlist 转换为 character
line_list <- unlist(strsplit(text, split = '\n'))
# 新建空 list,用于存储我们的数据
data <- list()
for (i in 1:length(line_list)) {
  line <- line_list[i]
  # 提取前 12 个字符,substr(x, start, stop)
  # 提取 start,stop 指定的 x 中字符的起始和结束位置
  prefix <- substr(line, 1, 12)
  # 判断是否包含字母数字
  if (grepl("\\w+", prefix)) {
    # 去除多余的空白字符
    key <- sub(pattern = "\\s+", replacement = "", x = prefix) 
  }
  # 获取 line 中位置 13 到末尾的字符,nchar(x) 计算字符串 x 的长度
  value <- substr(line, 13, nchar(line))
  if (key == "ENTRY") {
    # 在这,使用 perl 形式的正则 perl = TRUE,以多个空白字符分隔字符串
    data$entry <- unlist(strsplit(value, split = "\\s+", perl = TRUE))[1]
  } else if (key == "NAME") {
    v <- substr(value, 1, nchar(value)-1)
    data$name <- c(data$name, v)
  } else if (key == "ENZYME") {
    v <- unlist(strsplit(value, split = "\\s+", perl = TRUE))
    data$enzyme <- c(data$enzyme, v)
  } else if (key == "DBLINKS") {
    v = unlist(strsplit(value, ": "))
    data$dblinks[v[1]] <- v[2]
  }
}

输出提取的信息

> data
$entry
[1] "C01290"

$name
[1] "Lactosylceramide"                                      
[2] "beta-D-Galactosyl-(1->4)-beta-D-glucosyl-(11)-ceramide"
[3] "beta-D-Galactosyl-1,4-beta-D-glucosylceramide"         
[4] "Gal-beta1->4Glc-beta1->1'Cer"                          
[5] "LacCer"                                                
[6] "Lactosyl-N-acylsphingosine"                            
[7] "D-Galactosyl-1,4-beta-D-glucosylceramid"               

$enzyme
 [1] "2.4.1.92"  "2.4.1.206" "2.4.1.228" "2.4.1.274" "2.4.99.1"  "2.4.99.9"  "3.2.1.18"  "3.2.1.22" 
 [9] "3.2.1.23"  "3.2.1.47"  "3.2.1.52" 

$dblinks
       PubChem          ChEBI      LIPIDMAPS      LipidBank 
        "4509"        "17950" "LMSP0501AB00"      "GSG1147" 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
采集城市公交、地铁站点和线路数据可以帮助我们更好地了解城市公共交通系统的运作情况,为城市交通规划和出行提供参考。下面是一个基于Python的爬虫示例,可以用来采集城市公交、地铁站点和线路数据。 1. 确定爬取的网站 首先需要确定你想要采集的城市公交、地铁站点和线路数据所在的网站。常见的网站有: - 公交线路查询网站,如高德地图、百度地图等; - 公交、地铁运营公司的官方网站; - 公交、地铁相关的开放数据平台,如城市公共交通数据开放平台等。 2. 分析网站结构 在确定了采集的网站后,需要分析网站的结构,了解需要爬取的数据所在的页面、标签和属性等信息。可以使用开发者工具来帮助分析网站结构。 3. 使用Python爬虫代码采集数据 在分析了网站结构后,可以使用Python编写爬虫代码来采集数据。其中需要用到的模块包括: - requests:用于发送HTTP请求,获取网页内容; - BeautifulSoup4:用于解析HTML页面,提取所需数据; - pandas:用于数据处理和存储。 下面是一个示例代码,可以爬取高德地图上北京市公交线路数据: ```python import requests from bs4 import BeautifulSoup import pandas as pd # 获取公交线路列表页面 url = 'https://ditu.amap.com/bus/beijing' r = requests.get(url) # 解析HTML页面,获取所有公交线路名称及其链接 soup = BeautifulSoup(r.text, 'html.parser') lines = soup.find_all('a', {'class': 'bus-tit'}) # 遍历每个公交线路,获取站点信息 data = [] for line in lines: line_name = line.text line_url = 'https:' + line['href'] r = requests.get(line_url) soup = BeautifulSoup(r.text, 'html.parser') stations = soup.find_all('div', {'class': 'station-name'}) station_names = [s.text for s in stations] data.append({'line': line_name, 'stations': station_names}) # 将数据保存为CSV文件 df = pd.DataFrame(data) df.to_csv('bus_lines.csv', index=False) ``` 运行以上Python代码后,将会在当前文件夹下生成一个名为bus_lines.csv的CSV文件,其中包含了所有北京市公交线路及其站点信息。 以上示例代码仅为一个简单的示例,实际应用中可能需要更复杂的爬虫代码来处理数据。同时,需要注意合法使用爬虫,遵守相关法律法规。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

名本无名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值