5

ベクトルがある場合

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

そして、やります:

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

私は得る:

y
      ajjss auyjyjjksjj 
          1           1 

ただし、2番目の文字列 "auyjyjjksjj"は、部分文字列"jj"を2回カウントする必要があります。これを真/偽の計算から実際に「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))

stringAsFactors = Fを指定しない限り、data.frame(x、freq)は文字列を因子に自動的に変換するため、df$xを文字列に戻す必要があります。

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

間違ったツールを使用しています。試してみてください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の優れたQ&Aからのものです。

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 に答える