前言
在这,我们接续昨天的 Python 数据处理(二),将以 R 语言的形式,重新实现一遍同样的数据提取操作
为什么我要这么做呢,其实我是这么想的:
-
很多人对于不同语言之间的差异,很难有个清楚的认识
-
还有人认为每种编程语言相互独立,总是无法找到它们之间的关联性
-
以我自己的理解,很多编程语言的思想都是互通的,只是实现的方式各有区别。而我们要做的,就是抓住它们之间的共同点,不论语言怎么变,语法怎么变,核心思想还是在那。
-
最后,希望大家在我这种讲解的方式中,体会到它们之间的紧密联系,这样就不会苦恼于学谁好,先学谁。只要理解这种编程思想,不管什么语言,学起来都很快的。而且可以快速提高自己对编程的理解,对实现方式的认知更加全面。
下面进入正题
获取文件内容
1. 使用模块
在 Python 爬虫项目中,最常用的是 requests 模块。
而在 R 中,我们使用 rvest 模块,进行网页解析以及获取网页内容。
# install "rvest" package
install.packages("rvest")
# library
library(rvest)
2. 解析网页
我们还是以昨天的链接为例
首先用 read_html 读取网页链接
然后用 html_text 读取整个网页内容,返回的是一个字符串
# 网页链接
URL <- "http://rest.kegg.jp/get/cpd:C01290"
# 获取 URL 网页
res <- read_html(URL)
# 读取网页文本
text <- html_text(res)
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"
总结
仔细看看代码逻辑,和 Python 是很像的。
其中一些函数可以映射到 Python 中的函数,虽然他们之间用法、参数、返回值会有点差别,但是作用是类似的。
上面代码中我们都是用 R 自带的字符串操作,用起来比较麻烦,不是很得心应手。
后面,我会给大家讲讲 R 的字符串操作模块 stringr,能极大提升我们开发效率。
好了,今天就讲这么多吧!有是忙碌的一天~






网友评论