最近筆者在研讀一些文獻勉躺,發(fā)現(xiàn)了Remote Sensing of Environment上的一期Special Issues饵溅。這一期可以說是地學上Data Assimilation較為經(jīng)典的研究吧。所以也是目前研讀的重點妇萄。當然也是有些其他需求蜕企,現(xiàn)在想對這一期專刊的作者與客座編輯做些分析探討冠句。涉及到一些R語言的字符串處理方式轻掩。這里記錄下。
1 數(shù)據(jù)描述
數(shù)據(jù)就比較簡單了。一共兩個數(shù)據(jù)。第一個數(shù)據(jù)如下忠蝗。
主要包括Title和Author兩列膛堤,這個數(shù)據(jù)我命名為RSEDAPaper.xlsx文件奋构。
第二個數(shù)據(jù)如下壳影。
主要包括EditorBoard弥臼,這個數(shù)據(jù)我命名為EditorBoard.xlsx文件。
2 問題描述與思路
我其實想了解Remote Sensing of Environment這一期屟跷裕刊里鼠锈,Editor Board參與的文章數(shù)量有幾篇?所以這就涉及到兩個處理样傍,第一步是首先要對Author的字段進行分割成單獨的作者炕檩,第二步是與EditorBoard的數(shù)據(jù)做匹配捞蚂。
3 R語言實現(xiàn)
第一步首先要把用R語言將數(shù)據(jù)讀入到內(nèi)存里。由于我存的都是Excel文件,就需要用到openxlsx包扩然。之前我已經(jīng)介紹過如何在R里讀取Excel文件兵拢。詳情請見下文鏈接嘹履。
library(openxlsx)
basepath <- "E:/RSEDA/"
RSEDA <- read.xlsx(paste(basepath, "RSEDAPaper.xlsx", sep = ""))
Editor <- read.xlsx(paste(basepath, "EditorBoard.xlsx", sep = ""))
basepath是你存放數(shù)據(jù)的路徑焰枢,根據(jù)具體情況來處理暑椰。
接下來就是涉及到第一步處理低滩,我們首先將Author這種一長串的數(shù)據(jù)進行分割婶溯。
其實這種論文的作者名是比較好分割的渔扎,直接使用","分割即可。使用的R語言函數(shù)是strsplit笤虫。輸入函數(shù)最主要包括兩個,一個是字符串,一個是分割符號。樣例如下:
a <- RSEDA$Author[2]
a
a <- unlist(strsplit(a, split = ","))
a
兩次輸出分別為:
可以發(fā)現(xiàn)已經(jīng)成功做了分割转捕,使得變成了7個作者單獨的一個向量与柑,當然如果你的字符串連接方式不是","脯倚,你只需要在split的等號后面進行修改。而作者個數(shù)不相同的情況下淤堵,這樣子如何存儲呢?這時候就用到了R里的一個特殊存儲結(jié)構(gòu):列表。列表很適合存儲這種長度不一的一些數(shù)據(jù)贵扰。
authorlist <- list()
for (i in 1:nrow(RSEDA)) {
authors <- RSEDA$Author[i]
authors <- unlist(strsplit(authors, split = ","))
authorlist[[i]] <- authors
}
authorlist
可以發(fā)現(xiàn)很好的存儲起來了谷誓,當然還有個小問題糙臼。由于英文的一些空格的原因,導致有些作者前后多了空格痕届。所以做下一步匹配之前需要對這個進行處理渊啰,這里用的是stringr包绘证。
library(stringr)
b <- " John M. Morrison "
str_trim(b, "both")
效果如圖,side = "both"蚌斩,指去除掉兩邊的空格员魏,"left"和"right"則是去除左邊或右邊的空格闷袒。接下來只需要篩選數(shù)據(jù)做匹配也物。這里先生成一個跟前面authorlist一樣結(jié)構(gòu)的editorlist列表。然后針對每一篇文章作者分析列疗,用一個for循環(huán)和luse獲取作者個數(shù)滑蚯,然后,再嵌套一個for循環(huán)抵栈,獲取這一篇文章里每個作者名字告材,接著去除空格,然后是匹配古劲,ifelse語句的含義是表示斥赋,如果這個作者名字有出現(xiàn)在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)
}
}
輸出結(jié)果如圖。接著對每一篇文章統(tǒng)計胰舆,是否有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蹋嵌。
事實上分析結(jié)果顯示育瓜,這一期專刊里居然一個Editor Board也沒有參與文章發(fā)表栽烂。也是蠻奇怪的躏仇。后期可能會針對這些文獻做些介紹。這一期的R語言處理的步驟也可以用到其他部分腺办,其實主要是字符串分割焰手,去除空格以及簡單的包含處理。