首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >了解字符串中模式出现的次数。

了解字符串中模式出现的次数。
EN

Stack Overflow用户
提问于 2021-11-01 07:55:50
回答 2查看 70关注 0票数 2

我的意见:

代码语言:javascript
运行
复制
library(tidyverse)
library(stringi)
tdf<-data.frame("foo"=c('|ReviewNG-BB.2|ReviewNG-BB.3','|ReviewNG-BB.2|ReviewNG-BB.3','|ReviewNG-BB.2|ReviewNG-BB.3','|ReviewNG-BB.2|ReviewNG-BB.3','|ReviewNG-BB.2|ReviewNG-BB.3','|ReviewNG-BB.2|NG-BB.3','|ReviewNG-BB.2|NG-BB.3','|ReviewNG-BB.2|NG-BB.3','|ReviewNG-BB.2|NG-BB.3','|ReviewNG-BB.2|NG-BB.3','|ReviewNG-BB.2|NG-BB.3','|TI'), 
"bar"=c('|AI|BB.2','|AI|BB.2','|AI|BB.2','|AI|BB.2','|AI|BB.2','|AI|BB.2','|AI|BB.2','|AI|ReviewNG-BB.2','|AI|ReviewNG-BB.2','|AI|ReviewNG-BB.2','|AI|ReviewNG-BB.2','|AI'), 
                 "xyz" = c('|ICV|NG-AI','|ICV|NG-AI','|ICV|NG-AI','|ICV|NG-AI','|ICV|NG-AI','|ICV|NG-AI','|ICV|NG-AI','|ReviewNG-ICV|TI|BB.2',
'|ReviewNG-ICV|TI|BB.2','|ReviewNG-ICV|TI|BB.2','|ReviewNG-ICV|TI|BB.2','|ICV'),
                 "gaz" = c('|BB.3|ReviewNG-AI|NG-TI','|BB.3|ReviewNG-AI|NG-TI','|BB.3|ReviewNG-AI|NG-TI','|BB.3|ReviewNG-AI|NG-TI',
'|BB.3|ReviewNG-AI|NG-TI','|BB.3|ReviewNG-AI|NG-TI','|BB.3|ReviewNG-AI|NG-TI','|NG-BB.2|ICV|AI|TI','|NG-BB.2|ICV|AI|TI','|NG-BB.2|ICV|AI|TI',
'|NG-BB.2|ICV|AI|TI','|BB.2'))

我试着在我的tdf中计算每个标签出现的次数,所有标签都有4种“表单”:发生总数、ReviewNG-labelNG-label,以及至少“纯”|label, |label|。例如,标签AI,拥有所有匹配的总计,有ReviewNG-AING-AI,和|AI|AI|纯形式。所以我的代码:

代码语言:javascript
运行
复制
pt_t <- c("AI" )
sum(stringi::stri_count_fixed(tdf, regex(pt_t)))
pt_rng <- c("ReviewNG-AI")
sum(stringi::stri_count_fixed(tdf, regex(pt_rng)))
pt_ng<-c("NG-AI")
sum(stringi::stri_count_fixed(tdf, regex(pt_ng)))
pt<-c("|AI","|AI|")
sum(stringi::stri_count_fixed(tdf, regex(pt)))

我的产出是:

代码语言:javascript
运行
复制
Warning in stringi::stri_count_fixed(tdf, regex(pt_t)) :
  argument is not an atomic vector; coercing
[1] 30
Warning in stringi::stri_count_fixed(tdf, regex(pt_rng)) :
  argument is not an atomic vector; coercing
[1] 7
Warning in stringi::stri_count_fixed(tdf, regex(pt_ng)) :
  argument is not an atomic vector; coercing
[1] 14
Warning in stringi::stri_count_fixed(tdf, regex(pt)) :
  argument is not an atomic vector; coercing
[1] 15

首先,我对警告信息不太理解。现在,让我们来看看一个数字:总的来说,它是可以的,对于ReviewNG-AI仍然不错。但是接下来一个问题是:对于NG-AI,我理解的是双计数NG加上ReviewNG,而最后一个“纯”计数是|AI' or '|AI|,我完全不明白它是如何相等于15,其中手动计数16。

我也尝试了stringr中的tidyverse,但是这里的输出非常错误:

代码语言:javascript
运行
复制
sum(str_count(tdf,pt))

res<-tdf %>% 
  summarise(across(everything(),
                   ~sum(str_count(.x, paste(pt)))))

rowSums(res)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-01 08:28:47

这里的问题是在RegEx中使用一个特殊字符:|是为RegEx中的or保留的。如果我们想要搜索|,我们需要用\\|来逃避。因此,例如:

代码语言:javascript
运行
复制
library(dplyr)
library(stringr)

pt <- c("\\|AI", "\\|AI\\|")

现在,我们要计算|AI|AI|的每一次出现,因此搜索模式如下所示:

代码语言:javascript
运行
复制
paste(pt, collapse = "|")
#> [1] "\\|AI|\\|AI\\|"

所以,把它们放在一起:

代码语言:javascript
运行
复制
tdf %>% 
  summarise(across(everything(),
                   ~sum(str_count(.x, paste(pt, collapse = "|")))))

返回

代码语言:javascript
运行
复制
  foo bar xyz gaz
1   0  12   0   4
票数 2
EN

Stack Overflow用户

发布于 2021-11-01 09:03:18

也许是这样的解决方案。正如马丁已经解释过的,为什么和如何我们可以采取不同的策略。如果所有标签都由|分隔

我们可以pivot_longercount他们。取决于您想要的输出:

代码语言:javascript
运行
复制
library(dplyr)
library(tidyr)

tdf %>% 
  pivot_longer(
    everything()
  ) %>% 
  mutate(value = sub('\\|', '', value)) %>% 
  separate_rows(value, sep = "\\|") %>% 
  group_by(name, value) %>% 
  summarise(Labels = n())
代码语言:javascript
运行
复制
   name  value         Labels
   <chr> <chr>          <int>
 1 bar   AI                12
 2 bar   BB.2               7
 3 bar   ReviewNG-BB.2      4
 4 foo   NG-BB.3            6
 5 foo   ReviewNG-BB.2     11
 6 foo   ReviewNG-BB.3      5
 7 foo   TI                 1
 8 gaz   AI                 4
 9 gaz   BB.2               1
10 gaz   BB.3               7
11 gaz   ICV                4
12 gaz   NG-BB.2            4
13 gaz   NG-TI              7
14 gaz   ReviewNG-AI        7
15 gaz   TI                 4
16 xyz   BB.2               4
17 xyz   ICV                8
18 xyz   NG-AI              7
19 xyz   ReviewNG-ICV       4
20 xyz   TI                 4
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69794032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档