加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 使用具有多个输入的grepl分配组

发布时间:2020-12-14 06:00:31 所属栏目:百科 来源:网络整理
导读:我有一个数据帧: df - data.frame(name=c("john","david","callum","joanna","allison","slocum","lisa"),id=1:7)df name id1 john 12 david 23 callum 34 joanna 45 allison 56 slocum 67 lisa 7 我有一个包含正则表达式的向量,我希望在df $name变量中找到
我有一个数据帧:

df <- data.frame(name=c("john","david","callum","joanna","allison","slocum","lisa"),id=1:7)
df

     name id
1    john  1
2   david  2
3  callum  3
4  joanna  4
5 allison  5
6  slocum  6
7    lisa  7

我有一个包含正则表达式的向量,我希望在df $name变量中找到它:

vec <- c("lis","^jo","um$")

我想得到的输出如下:

name id group
1    john  1     2
2   david  2    NA
3  callum  3     3
4  joanna  4     2
5 allison  5     1
6  slocum  6     3
7    lisa  7     1

我可以做到以下几点:

df$group <- ifelse(grepl("lis",df$name),1,ifelse(grepl("^jo",2,ifelse(grepl("um$",3,NA)

但是,我想直接从’vec’这样做.我在一个闪亮的应用程序中反应性地生成不同的值.我可以根据vec中的索引分配组吗?

此外,如果发生类似下面的事情,该组应该是第一个出现的.例如’callum’对于’all’和“um $”为TRUE,但是应该在这里获得组1.

vec <- c("all","um$")

解决方法

以下是几个选项:

df$group <- apply(Vectorize(grepl,"pattern")(vec,function(ii) which(ii)[1])
#     name id group
#1    john  1     2
#2   david  2    NA
#3  callum  3     3
#4  joanna  4     2
#5 allison  5     1
#6  slocum  6     3
#7    lisa  7     1

使用命名向量并在其上合并:

names(vec) <- seq_along(vec)

df <- merge(df,stack(Vectorize(grep,"pattern",SIMPLIFY=FALSE)(vec,df$name)),by.x="id",by.y="values",all.x = TRUE)

df[!duplicated(df$id),] # to keep only the first match
#  id    name  ind
#1  1    john    2
#2  2   david <NA>
#3  3  callum    3
#4  4  joanna    2
#5  5 allison    1
#6  6  slocum    3
#7  7    lisa    1

一个for循环:

df$group <- NA

for ( i in rev(seq_along(vec))) {
  TFvec <- grepl(vec[i],df$name)
  df$group[TFvec] <- i
}

df
#     name id group
#1    john  1     2
#2   david  2    NA
#3  callum  3     3
#4  joanna  4     2
#5 allison  5     1
#6  slocum  6     3
#7    lisa  7     1

或者你可以使用带有stringi的stri_match_first_regex的outer

library(stringi)
match.mat <- outer(df$name,vec,stri_match_first_regex)
df$group <- apply(match.mat,function(ii) which(!is.na(ii))[1]) 
# [1] for first match in `vec`

#     name id group
#1    john  1     2
#2   david  2    NA
#3  callum  3     3
#4  joanna  4     2
#5 allison  5     1
#6  slocum  6     3
#7    lisa  7     1

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读