从字符串中提取所有单词并用结果创建一个列
Extract all words from a string and create a column with the result
我有一个数据框 (data3),其列名为 "Collector"。在这个专栏中,我有字母数字字符。例如:"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, file, 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)
问题是 str_extract_all
不是只找到一个字符串,而是一个包含多个字符串的列表。例如:
> dput(str_extract_all("Ruiz and Galvis 650", "[[:alpha:]]+"))
list(c("Ruiz", "and", "Galvis"))
具有嵌套元素(如上)的数据框显然无法保存到文件中。
但是,如果您更新正则表达式模式以匹配 space 和字母,您可以返回使用 str_extract
代替:
> dput(str_extract("Ruiz and Galvis 650", "[[:alpha:] ]+"))
"Ruiz and Galvis "
注意第二个正则表达式中的 space。这会将所有 letters/spaces 作为一个字符串匹配,并允许您将 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
我有一个数据框 (data3),其列名为 "Collector"。在这个专栏中,我有字母数字字符。例如:"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, file, 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)
问题是 str_extract_all
不是只找到一个字符串,而是一个包含多个字符串的列表。例如:
> dput(str_extract_all("Ruiz and Galvis 650", "[[:alpha:]]+"))
list(c("Ruiz", "and", "Galvis"))
具有嵌套元素(如上)的数据框显然无法保存到文件中。
但是,如果您更新正则表达式模式以匹配 space 和字母,您可以返回使用 str_extract
代替:
> dput(str_extract("Ruiz and Galvis 650", "[[:alpha:] ]+"))
"Ruiz and Galvis "
注意第二个正则表达式中的 space。这会将所有 letters/spaces 作为一个字符串匹配,并允许您将 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