另一个字符串匹配哪个字符串模式

时间:2019-01-16 19:28:07

标签: r regex dplyr

我有一个列变量,我想分成三个因子变量。有我要创建的因子变量:

goal<-c('newref', 'meow', 'woof')
area<-c('eco', 'social', 'bank')
fr<-c('demo', 'hist', 'util')

当前变量看起来或多或少是这样的:

code<-c('goal\\\\meow', 'area\\\\bank', 'area\\\\bank', 'fr\\\\utilitarian', 'fr\\\\history')

我们假设数据框就是这样的

df<-data.frame(var1=c(1,2,3,4,5), var2=c('a', 'b', 'c', 'd', 'e'), code=code)

所以我想创建3个新列,每个因子变量一个,并使用一个正则表达式来检测其所属。因此,例如第一行应如下所示:

row1<-data.frame(var1=1, var2=c('a'), code=c('goal\\\\meow'), goal=2, area=NA, fr=NA)

还请注意,因子变量的值是代码中的值(例如,history / hist)的缩写。  该数据库可能有10000个条目,因此,我对此表示感谢。 谢谢!

2 个答案:

答案 0 :(得分:2)

我们可以定义一个函数,以查找因子变量的位置,该变量用作正则表达式时,可以在code列中找到匹配项:

find_match <- function(code, matches) {
    apply(sapply(matches, grepl, code), 1, match, x=T)
}

如果没有匹配项,则此函数为该行返回NA

接下来,我们可以简单地使用mutate中的dplyr来添加因子的每一列:

df %>% mutate(goal = find_match(code, goal),
              area = find_match(code, area),
              fr = find_match(code, fr))

哪个给:

  var1 var2              code goal area fr
1    1    a      goal\\\\meow    2   NA NA
2    2    b      area\\\\bank   NA    3 NA
3    3    c      area\\\\bank   NA    3 NA
4    4    d fr\\\\utilitarian   NA   NA  3
5    5    e     fr\\\\history   NA   NA  2

答案 1 :(得分:0)

使用tidyverse工具(例如管道%>%和dplyr)进行此操作:

Separate使用您指定的分隔符将代码列分成两部分。

因为“ \”是正则表达式中的特殊字符,所以您必须转义每个要查找的\。

Spread可以根据需要将其从高大的形式转换为宽大的形式。

library(dplyr)
df %>% 
  separate(code, into = c("colName", "value"), sep = "\\\\\\\\") %>% 
  spread(colName, value)