计算字符“;”两边的字符串
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 日创建
我有一个数据框,其中包含一个如下所示的列:
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 日创建