2016-09-24 117 views
0

我有一個名爲「集電極」列的數據幀(DATA3)創建一列。在這一列中我有字母數字字符。例如:「Ruiz and Galvis 650」。我需要單獨提取字母字符和數字字符,並創建兩個新欄目,一個以該字符串(ColID)的數量,另一個與所有的字(COL):從字符串中提取的所有單詞,並用結果

輸入:

Collector      Times  Sample 
Ruiz and Galvis 650    9   SP.1    
Smith et al 469     8   SP.1 

預期輸出

Collector      Times  Sample  ColID Col 
Ruiz and Galvis 650    9   SP.1  650  Ruiz and Galvis 
Smith et al 469     8   SP.1  469  Smith et al 

我曾嘗試以下,但是當我嘗試保存我得到一個錯誤(錯誤文件中.External2(C_writetable,X,文件,nrow(X),p,rnames, sep,eol,: 'EncodeElement'中的未實現類型'list'):

regexp <- "[[:digit:]]+" 
data3$colID<- NA 
data3$colID <- str_extract (data3$Collector, regexp) 

data3$Col<- NA 
regexp <-"[[:alpha:]]+" 
data3$Col <- (str_extract_all (data3$Collector, regexp)) 
write.table(data3, file = paste("borrar2",".csv", sep=""), quote=T, sep = ",", row.names = F) 

回答

2

的問題是,str_extract_all沒有發現只是一個單一的字符串,但多個列表。例如:

> dput(str_extract_all("Ruiz and Galvis 650", "[[:alpha:]]+")) 
list(c("Ruiz", "and", "Galvis")) 

具有嵌套元素的數據框(如上所述)顯然不能保存到文件中。

但是,如果你更新的正則表達式匹配模式空間以及字母,你可以回去使用str_extract代替:

> dput(str_extract("Ruiz and Galvis 650", "[[:alpha:] ]+")) 
"Ruiz and Galvis " 

注意,在第二正則表達式的空間。這將所有字母/空格匹配爲一個字符串,並允許您將data.frame寫入文件。

+0

這解決了我的問題。非常感謝! –

0

如果你的數據是儘可能均勻的例子顯示,那麼這是另一種選擇:

library(stringi) 
library(purrr) 
library(dplyr) 

df <- data.frame(Collector=c("Ruiz and Galvis 650", "Smith et al 469"), 
       Times=c(9, 8), 
       Sample=c("SP.1", "SP.1"), 
       stringsAsFactors=FALSE) 

stri_match_first(df$Collector, regex="([[:alpha:][:space:]]+) ([[:digit:]]+)") %>% 
    as.data.frame(stringsAsFactors=FALSE) %>% 
    select(Col=V2, ColID=V3) %>% 
    bind_cols(df) %>% 
    select(-Collector) 
##    Col ColID Times Sample 
## 1 Ruiz and Galvis 650  9 SP.1 
## 2  Smith et al 469  8 SP.1 
+0

感謝您的支持!你的回答讓我想起了關於這個話題的更多內容。 –

相關問題