最近笔者在研读一些文献,发现了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语言处理的步骤也可以用到其他部分,其实主要是字符串分割,去除空格以及简单的包含处理。