5

如果我有一个向量

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

并做:

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

我得到:

y
      ajjss auyjyjjksjj 
          1           1 

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

此外,如果对于每个字符串,可以计算出子字符串的频率除以字符串的长度,那就太好了。

提前致谢。

4

4 回答 4

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
于 2013-03-24T16:19:25.367 回答
7

你使用了错误的工具。Try 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
于 2013-03-24T16:17:48.640 回答
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
于 2013-03-24T16:39:05.650 回答
2

这个简单的base r单行代码先使用 strsplit,然后使用 grepl,并且相当健壮,但如果必须将匹配计数jjjjjj为 3 个jj. 使这成为可能的模式匹配来自@JoshOBriens 出色的问答

sum( grepl( "jj" , unlist(strsplit( x , "(?<=.)(?=jj)" , perl = TRUE) ) ) )



# Examples....
f<- function(x){
    sum( grepl( "jj" , unlist(strsplit( x , "(?<=.)(?=jj)" , perl = TRUE) ) ) )
    }   

  #3 matches here
  xOP <- c("ajjss","acdjfkj","auyjyjjksjj")
  f(xOP)
  # [1] 3

  #4 here
  x1 <- c("ajjss","acdjfkj", "jj" , "auyjyjjksjj")
  f(x1)
  # [1] 4

  #8 here
  x2 <- c("jjbjj" , "ajjss","acdjfkj", "jj" , "auyjyjjksjj" , "jjbjj")
  f(x2)
  # [1] 8

  #Doesn't work yet with multiple jjjj matches. We want this to also be 8
  x3 <- c("jjjj" , "ajjss","acdjfkj", "jj" , "auyjyjjksjj" , "jjbjj")
  f(x3)
  # [1] 7  
于 2013-03-24T17:37:18.637 回答