R 从字符串中提取所有单词,并使用结果创建一列
我有一个数据帧(data3),其中有一列名为“Collector”。在本栏中,我有字母数字字符。例如:“Ruiz和Galvis 650”。我需要分别提取字母字符和数字字符,并创建两个新列,一个包含该字符串的数字(ColID),另一个包含所有单词(Col): 输入:R 从字符串中提取所有单词,并使用结果创建一列,r,string,dataframe,extract,alphanumeric,R,String,Dataframe,Extract,Alphanumeric,我有一个数据帧(data3),其中有一列名为“Collector”。在本栏中,我有字母数字字符。例如:“Ruiz和Galvis 650”。我需要分别提取字母字符和数字字符,并创建两个新列,一个包含该字符串的数字(ColID),另一个包含所有单词(Col): 输入: Collector Times Sample Ruiz and Galvis 650 9 SP.1 Smith e
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,file,nrow(x),p,rnames,sep,eol,)中出错:
“EncodeElement”中未实现的类型“list”:
regexp问题在于str\u extract\u all
不能只找到单个字符串,而是找到多个字符串的列表。例如:
> dput(str_extract_all("Ruiz and Galvis 650", "[[:alpha:]]+"))
list(c("Ruiz", "and", "Galvis"))
带有嵌套元素的数据框(如上所述)显然无法保存到文件中
但是,如果更新正则表达式模式以匹配空格和字母,则可以使用str\u extract
:
> dput(str_extract("Ruiz and Galvis 650", "[[:alpha:] ]+"))
"Ruiz and Galvis "
请注意第二个正则表达式中的空格。这将所有字母/空格匹配为一个字符串,并允许您将data.frame写入文件。问题在于str\u extract\u all
不仅查找单个字符串,还查找多个字符串的列表。例如:
> dput(str_extract_all("Ruiz and Galvis 650", "[[:alpha:]]+"))
list(c("Ruiz", "and", "Galvis"))
带有嵌套元素的数据框(如上所述)显然无法保存到文件中
但是,如果更新正则表达式模式以匹配空格和字母,则可以使用str\u extract
:
> dput(str_extract("Ruiz and Galvis 650", "[[:alpha:] ]+"))
"Ruiz and Galvis "
请注意第二个正则表达式中的空格。这将所有字母/空格匹配为一个字符串,并允许您将data.frame写入一个文件。如果您的数据与示例中显示的一样一致,则这是另一个选项:
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
库(stringi)
图书馆(purrr)
图书馆(dplyr)
df%
as.data.frame(stringsAsFactors=FALSE)%>%
选择(Col=V2,ColID=V3)%>%
绑定列(df)%>%
选择(-Collector)
##Col-ColID时间样本
##1 Ruiz和Galvis 650 9 SP.1
##2 Smith等人469 8 SP.1
如果您的数据如示例所示是统一的,那么这是另一个选项:
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
库(stringi)
图书馆(purrr)
图书馆(dplyr)
df%
as.data.frame(stringsAsFactors=FALSE)%>%
选择(Col=V2,ColID=V3)%>%
绑定列(df)%>%
选择(-Collector)
##Col-ColID时间样本
##1 Ruiz和Galvis 650 9 SP.1
##2 Smith等人469 8 SP.1
谢谢!你的回答让我对这个话题有了更多的了解。谢谢!你的回答让我对这个话题有了更多的了解。