美文网首页R
R 数据处理(二)

R 数据处理(二)

作者: 名本无名 | 来源:发表于2021-01-07 21:56 被阅读0次

前言

在这,我们接续昨天的 Python 数据处理(二),将以 R 语言的形式,重新实现一遍同样的数据提取操作

为什么我要这么做呢,其实我是这么想的:

  1. 很多人对于不同语言之间的差异,很难有个清楚的认识

  2. 还有人认为每种编程语言相互独立,总是无法找到它们之间的关联性

  3. 以我自己的理解,很多编程语言的思想都是互通的,只是实现的方式各有区别。而我们要做的,就是抓住它们之间的共同点,不论语言怎么变,语法怎么变,核心思想还是在那。

  4. 最后,希望大家在我这种讲解的方式中,体会到它们之间的紧密联系,这样就不会苦恼于学谁好,先学谁。只要理解这种编程思想,不管什么语言,学起来都很快的。而且可以快速提高自己对编程的理解,对实现方式的认知更加全面。

下面进入正题

获取文件内容

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,能极大提升我们开发效率。

好了,今天就讲这么多吧!有是忙碌的一天~

相关文章

网友评论

    本文标题:R 数据处理(二)

    本文链接:https://www.haomeiwen.com/subject/uhmtaktx.html