计算字符“;”两边的字符串

Count strings either side of character ";"

我有一个数据框,其中包含一个如下所示的列:

df<-data.frame(x=runif(24),value=rep(c("B","C;D",NA,"CG;M;Bac","GCP;Coag+","GCP;CNS"),each=4))

我想计算“;”两边任何字符串出现的次数在每一行中。请注意,并非所有行都包含“;” (可以是单个条目或 NA)。所以输出看起来像:

1, 2, 0, 3, 2, 2 

以上。

如果我知道所有可能的字符串可能是什么,这就有效:

df %>%
mutate(stC = stringr::str_count(value, regex('dips|GNB|B|Bac|M', ignore_case = TRUE)))

但文件之间的数据通常不是同质的,因此正则表达式无法捕获所有内容。

我不能只数“;”因为我无法区分 NA 和单个条目。任何想法将不胜感激

使用strsplit:

sapply(strsplit(df$value, split = ";"), FUN = function(x) sum(!is.na(x)))

# [1] 1 1 1 1 2 2 2 2 0 0 0 0 3 3 3 3 2 2 2 2 2 2 2 2

如果您想将其保留在数据操作管道过程中:

library(tidyverse)
df %>%
    rowwise() %>%
    mutate(count = sum(!is.na(unlist(str_split(value, ";")))))

这里有一个技巧来自 gsub + nchar

transform(
  df,
  stC = nchar(gsub("[^;]", "", value)) + 1
)

这给出了

            x     value stC
1  0.07071245         B   1
2  0.57201489         B   1
3  0.21928640         B   1
4  0.24782731         B   1
5  0.54730194       C;D   2
6  0.11669014       C;D   2
7  0.39478743       C;D   2
8  0.90583778       C;D   2
9  0.23873492      <NA>  NA
10 0.88155678      <NA>  NA
11 0.34854135      <NA>  NA
12 0.70870930      <NA>  NA
13 0.51896957  CG;M;Bac   3
14 0.53956594  CG;M;Bac   3
15 0.55756380  CG;M;Bac   3
16 0.23305755  CG;M;Bac   3
17 0.01511163 GCP;Coag+   2
18 0.38403218 GCP;Coag+   2
19 0.25471746 GCP;Coag+   2
20 0.18228425 GCP;Coag+   2
21 0.40186797   GCP;CNS   2
22 0.73385147   GCP;CNS   2
23 0.01230535   GCP;CNS   2
24 0.83073539   GCP;CNS   2

这是一个tidyverse方法。

注:

  • str_count用于统计字符串;.
  • 的匹配次数 使用
  • +1 是因为根据您的数据,计数总是比模式匹配数多 1。
  • replace_na用于将stC中的NA替换为0
df<-data.frame(x=runif(24),value=rep(c("B","C;D",NA,"CG;M;Bac","GCP;Coag+","GCP;CNS"),each=4))

library(dplyr)
library(stringr)
library(tidyr)

df %>% 
  mutate(
    stC = stringr::str_count(value, ';') + 1,
    stC = tidyr::replace_na(stC, 0)
  )

#>             x     value   stC
#> 1  0.88706780         B     1
#> 2  0.07799586         B     1
#> 3  0.46904607         B     1
#> 4  0.82041905         B     1
#> 5  0.23627374       C;D     2
#> 6  0.56468751       C;D     2
#> 7  0.42610653       C;D     2
#> 8  0.54008977       C;D     2
#> 9  0.01811806      <NA>     0
#> 10 0.89693212      <NA>     0
#> 11 0.84679765      <NA>     0
#> 12 0.10942276      <NA>     0
#> 13 0.08499520  CG;M;Bac     3
#> 14 0.53090536  CG;M;Bac     3
#> 15 0.05778523  CG;M;Bac     3
#> 16 0.41714664  CG;M;Bac     3
#> 17 0.46357215 GCP;Coag+     2
#> 18 0.77451204 GCP;Coag+     2
#> 19 0.77849339 GCP;Coag+     2
#> 20 0.39174393 GCP;Coag+     2
#> 21 0.53444433   GCP;CNS     2
#> 22 0.80431627   GCP;CNS     2
#> 23 0.02675931   GCP;CNS     2
#> 24 0.63962421   GCP;CNS     2

reprex package (v0.3.0)

于 2021 年 3 月 19 日创建