GISdsq的个人博客分享 http://blog.sciencenet.cn/u/GISdsq

博文

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

已有 1568 次阅读 2018-6-5 15:00 |个人分类:技术干货|系统分类:科研笔记| R语言

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

1 数据描述

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

image

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

第二个数据如下。

image

主要包括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这种一长串的数据进行分割。

image

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

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

两次输出分别为:

image

image

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

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

image

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

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

image

image

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

editorlist <- list()
editorlist <- authorlistfor (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)
  }
}

image

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

RSEDA$editor <- 1for (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语言处理的步骤也可以用到其他部分,其实主要是字符串分割,去除空格以及简单的包含处理。



http://wap.sciencenet.cn/blog-3247241-1117523.html

上一篇:MODIS数据的简介和下载(六)——D3L Tool开发
下一篇:Coding and Paper Letter(一)

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2021-10-27 22:34

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部