【问题标题】:understanding count the number of occurrences of a pattern in a string理解计算字符串中模式出现的次数
【发布时间】:2021-12-16 00:19:31
【问题描述】:

我的意见:

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|纯形式。这样我的代码:

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)))

我的输出:

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。

我也在tidyverse 中尝试stringr,但这里的输出确实是错误的:

sum(str_count(tdf,pt))

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

rowSums(res)

【问题讨论】:

  • 每个标签是否用|分隔?

标签: r string dataframe tidyverse


【解决方案1】:

您的问题是在 RegEx 中使用了一个特殊字符:| 在 RegEx 中为 or 保留。如果我们想搜索|,我们需要使用\\| 进行转义。所以,例如:

library(dplyr)
library(stringr)

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

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

paste(pt, collapse = "|")
#> [1] "\\|AI|\\|AI\\|"

所以,把它们放在一起:

tdf %>% 
  summarise(across(everything(),
                   ~sum(str_count(.x, paste(pt, collapse = "|")))))

返回

  foo bar xyz gaz
1   0  12   0   4

【讨论】:

  • 如果标签有问题还有一个问题(例如Out PPS)计数不正确
  • 你能澄清一下问题吗? Out PPS 是什么意思?错误发生在哪里以及您期望的输出是什么?
  • 对不起,我的错我用//代替`\`
【解决方案2】:

也许这种解决方案。正如马丁已经解释了为什么以及如何我们可以采取不同的策略。 如果所有Label都用|隔开

我们可以pivot_longercount 他们。根据您想要的输出:

library(dplyr)
library(tidyr)

tdf %>% 
  pivot_longer(
    everything()
  ) %>% 
  mutate(value = sub('\\|', '', value)) %>% 
  separate_rows(value, sep = "\\|") %>% 
  group_by(name, value) %>% 
  summarise(Labels = n())
   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

【讨论】:

  • 我的 df 80+ 列中的问题
猜你喜欢
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2020-02-21
  • 2012-02-12
相关资源
最近更新 更多