使用grep确定字符串的频率

bru*_*lin 5 string grep r frequency

如果我有一个矢量

x <- c("ajjss","acdjfkj","auyjyjjksjj")
Run Code Online (Sandbox Code Playgroud)

并做:

y <- x[grep("jj",x)]
table(y)
Run Code Online (Sandbox Code Playgroud)

我明白了:

y
      ajjss auyjyjjksjj 
          1           1 
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢.

ndo*_*gan 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
Run Code Online (Sandbox Code Playgroud)

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

df$rate <- df$freq / nchar(as.character(df$x))
Run Code Online (Sandbox Code Playgroud)

有必要将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
Run Code Online (Sandbox Code Playgroud)


A5C*_*2T1 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
Run Code Online (Sandbox Code Playgroud)