R语言字符串处理的一次经历

  1. 云栖社区>
  2. 博客>
  3. 正文

R语言字符串处理的一次经历

胖胖雕 2018-06-05 14:58:36 浏览473
展开阅读全文
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ESA_DSQ/article/details/80581440

最近笔者在研读一些文献,发现了Remote Sensing of Environment上的一期Special Issues。这一期可以说是地学上Data Assimilation较为经典的研究吧。所以也是目前研读的重点。当然也是有些其他需求,现在想对这一期专刊的作者与客座编辑做些分析探讨。涉及到一些R语言的字符串处理方式。这里记录下。

1 数据描述

数据就比较简单了。一共两个数据。第一个数据如下。

主要包括Title和Author两列,这个数据我命名为RSEDAPaper.xlsx文件。

第二个数据如下。

主要包括EditorBoard,这个数据我命名为EditorBoard.xlsx文件。

2 问题描述与思路

我其实想了解Remote Sensing of Environment这一期专刊里,Editor Board参与的文章数量有几篇?所以这就涉及到两个处理,第一步是首先要对Author的字段进行分割成单独的作者,第二步是与EditorBoard的数据做匹配。

3 R语言实现

第一步首先要把用R语言将数据读入到内存里。由于我存的都是Excel文件,就需要用到openxlsx包。之前我已经介绍过如何在R里读取Excel文件。详情请见下文链接。

R语言读取Excel的神器——openxlsx

library(openxlsx)
basepath <- "E:/RSEDA/"
RSEDA <- read.xlsx(paste(basepath, "RSEDAPaper.xlsx", sep = ""))
Editor <- read.xlsx(paste(basepath, "EditorBoard.xlsx", sep = ""))

basepath是你存放数据的路径,根据具体情况来处理。

接下来就是涉及到第一步处理,我们首先将Author这种一长串的数据进行分割。

其实这种论文的作者名是比较好分割的,直接使用”,”分割即可。使用的R语言函数是strsplit。输入函数最主要包括两个,一个是字符串,一个是分割符号。样例如下:

a <- RSEDA$Author[2]
a
a <- unlist(strsplit(a, split = ","))
a

两次输出分别为:

可以发现已经成功做了分割,使得变成了7个作者单独的一个向量,当然如果你的字符串连接方式不是”,”,你只需要在split的等号后面进行修改。而作者个数不相同的情况下,这样子如何存储呢?这时候就用到了R里的一个特殊存储结构:列表。列表很适合存储这种长度不一的一些数据。

authorlist <- list()
for (i in 1:nrow(RSEDA)) {
  authors <- RSEDA$Author[i]
  authors <- unlist(strsplit(authors, split = ","))
  authorlist[[i]] <- authors
}
authorlist

可以发现很好的存储起来了,当然还有个小问题。由于英文的一些空格的原因,导致有些作者前后多了空格。所以做下一步匹配之前需要对这个进行处理,这里用的是stringr包。

library(stringr)
b <- " John M. Morrison "
str_trim(b, "both")

效果如图,side = “both”,指去除掉两边的空格,”left”和”right”则是去除左边或右边的空格。接下来只需要筛选数据做匹配。这里先生成一个跟前面authorlist一样结构的editorlist列表。然后针对每一篇文章作者分析,用一个for循环和luse获取作者个数,然后,再嵌套一个for循环,获取这一篇文章里每个作者名字,接着去除空格,然后是匹配,ifelse语句的含义是表示,如果这个作者名字有出现在Editor Board里,就输出1,如果没有输出0。

editorlist <- list()
editorlist <- authorlist
for (i in 1:nrow(RSEDA)) {
  luse <- length(authorlist[[i]])
  for (m in 1:luse) {
    deauthor <- authorlist[[i]][m]
    deauthor <- str_trim(deauthor, 'both')
    editorlist[[i]][m] <- ifelse(deauthor%in%Editor$EditorBoard, 1, 0)
  }
}

输出结果如图。接着对每一篇文章统计,是否有Editor Board,有的话是1,没有的话是0。

RSEDA$editor <- 1
for (i in 1:nrow(RSEDA)) {
  RSEDA$editor[i] <- ifelse("1"%in%editorlist[[i]], 1, 0) 
}

先生成了一个字段editor表示是否有Editor Board,默认值为1。而接着就是对每一行分析,这里每一行,是否有含”1”,有的话,即为有Editor Board。

事实上分析结果显示,这一期专刊里居然一个Editor Board也没有参与文章发表。也是蛮奇怪的。后期可能会针对这些文献做些介绍。这一期的R语言处理的步骤也可以用到其他部分,其实主要是字符串分割,去除空格以及简单的包含处理。

网友评论

登录后评论
0/500
评论
胖胖雕
+ 关注