前言
在这,我们接续昨天的 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,能极大提升我们开发效率。
还没有评论,来说两句吧...