如何从数据框中的列中提取字符串模式并创建包含提取的字符串的新数据框列?

时间:2016-05-20 22:27:03

标签: r

我正在尝试为我的数据框创建搜索键列。我想从我的数据框列中提取某些字符串模式,以用于沿着数据框的长度创建新的搜索关键字列。例如:

x <- c(1:4)
y <- c("BLUE,BALL","BALL,RED","BIG,GREEN,BALL","BALL")
dat <- data.frame(x,y)

给出,

>dat

x        y
1        BLUE,BALL
2        BALL,RED
3        BIG,GREEN,BALL
4        BALL

现在我想基于dat $ y中颜色模式的出现在数据框中创建一个新的搜索关键列。我想用:

    pattern="RED|GREEN|BLUE"

对于任何'pat'未在dat $ y中被识别的情况,我想在元素位置留空或'NA'。我希望我的结果如下所示:

>new.dat

x        y                search.color
1        BLUE,BALL        BLUE
2        BALL,RED         RED
3        BIG,GREEN,BALL   GREEN
4        BALL             NA

我用过

dat$first <-do.call(rbind,lapply(strsplit(dat[,2],split=" "), function(x) head(x,1)))

用于在我的数据框中创建第一个单词搜索键过滤器,但现在我正在搜索允许使用grepl或其他方法更多控制选择搜索键的方法。非常感谢任何帮助或资源。

2 个答案:

答案 0 :(得分:4)

stringr::str_extract应该轻松做你想做的事。

pat <- "(RED|GREEN|BLUE)"
dat <- transform(dat,search.color=stringr::str_extract(y,pat))
## dat
##   x              y search.color
## 1 1      BLUE,BALL         BLUE
## 2 2       BALL,RED          RED
## 3 3 BIG,GREEN,BALL        GREEN
## 4 4           BALL         <NA>

我确信还有一个基础R gsub()解决方案,但对我来说并不那么明显......

答案 1 :(得分:3)

我们也可以使用gregexpr/regmatches

中的base R
dat$search.color <- sapply(regmatches(dat$y,gregexpr(pat, dat$y)),`[`,1)
dat$search.color
#[1] "BLUE"  "RED"   "GREEN" NA     

数据

pat <- "(RED|GREEN|BLUE)"