R語言字符串處理的一次經歷

最近筆者在研讀一些文獻,發現了Remote Sensing of Environment上的一期Special Issues。這一期能夠說是地學上Data Assimilation較爲經典的研究吧。因此也是目前研讀的重點。固然也是有些其餘需求,如今想對這一期專刊的做者與客座編輯作些分析探討。涉及到一些R語言的字符串處理方式。這裏記錄下。git

1 數據描述

數據就比較簡單了。一共兩個數據。第一個數據以下。github

主要包括Title和Author兩列,這個數據我命名爲RSEDAPaper.xlsx文件。ide

第二個數據以下。函數

主要包括EditorBoard,這個數據我命名爲EditorBoard.xlsx文件。3d

2 問題描述與思路

我其實想了解Remote Sensing of Environment這一期專刊裏,Editor Board參與的文章數量有幾篇?因此這就涉及到兩個處理,第一步是首先要對Author的字段進行分割成單獨的做者,第二步是與EditorBoard的數據作匹配。code

3 R語言實現

第一步首先要把用R語言將數據讀入到內存裏。因爲我存的都是Excel文件,就須要用到openxlsx包。以前我已經介紹過如何在R裏讀取Excel文件。詳情請見下文連接。blog

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是你存放數據的路徑,根據具體狀況來處理。ci

接下來就是涉及到第一步處理,咱們首先將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語言處理的步驟也能夠用到其餘部分,其實主要是字符串分割,去除空格以及簡單的包含處理。

相關文章
相關標籤/搜索