使用grep确定字符串的频率

时间:2013-03-24 16:07:24

标签: string r grep frequency

如果我有一个载体

x <- c("ajjss","acdjfkj","auyjyjjksjj")

并且做:

y <- x[grep("jj",x)]
table(y)

我明白了:

y
      ajjss auyjyjjksjj 
          1           1 

但是第二个字符串“auyjyjjksjj”应该将子字符串“jj”计算两次。如何将其从真/假计算中更改为实际计算“jj”的频率?

此外,如果对于每个字符串,可以计算子字符串的频率除以字符串的长度,这将是很好的。

提前致谢。

4 个答案:

答案 0 :(得分:8)

我使用gregexpr()

解决了这个问题
x <- c("ajjss","acdjfkj","auyjyjjksjj")
freq <- sapply(gregexpr("jj",x),function(x)if(x[[1]]!=-1) length(x) else 0)
df<-data.frame(x,freq)

df
#            x freq
#1       ajjss    1
#2     acdjfkj    0
#3 auyjyjjksjj    2

对于问题的最后部分,计算频率 / 字符串长度 ...

df$rate <- df$freq / nchar(as.character(df$x))

有必要将df $ x转换回字符串,因为data.frame(x,freq)会自动将字符串转换为因子,除非您指定stringsAsFactors = F.

df
#            x freq      rate
#1       ajjss    1 0.2000000
#2     acdjfkj    0 0.0000000
#3 auyjyjjksjj    2 0.1818182

答案 1 :(得分:7)

您使用的是错误的工具。试试gregexpr,它会为您提供找到搜索字符串的位置(如果未找到,则为-1):

> gregexpr("jj", x, fixed = TRUE)
[[1]]
[1] 2
attr(,"match.length")
[1] 2
attr(,"useBytes")
[1] TRUE

[[2]]
[1] -1
attr(,"match.length")
[1] -1
attr(,"useBytes")
[1] TRUE

[[3]]
[1]  6 10
attr(,"match.length")
[1] 2 2
attr(,"useBytes")
[1] TRUE

答案 2 :(得分:3)

您可以使用qdap(虽然不在基本安装R中):

x <- c("ajjss","acdjfkj","auyjyjjksjj")
library(qdap)
termco(x, seq_along(x), "jj")

## > termco(x, seq_along(x), "jj")
##   x word.count         jj
## 1 1          1 1(100.00%)
## 2 2          1          0
## 3 3          1 2(200.00%)

请注意,输出的频率和频率与字数相比(输出实际上是一个列表,但打印出漂亮的输出)。要访问频率:

termco(x, seq_along(x), "jj")$raw

## > termco(x, seq_along(x), "jj")$raw
##   x word.count jj
## 1 1          1  1
## 2 2          1  0
## 3 3          1  2

答案 3 :(得分:2)

base r中的这个简单的单行使用strsplit然后grepl,并且相当健壮,但如果必须将jjjjjj之类的匹配计为3批{{1} }。使此成为可能的模式匹配来自@JoshOBriens excellent Q&A

jj