grep

2013-03-24 22 views
5

kullanarak dize sıklığını belirlemek iki kez "jj" substring. Bunu "jj" frekansını gerçekten saymak için doğru/yanlış bir hesaplamadan nasıl değiştirebilirim?grep

Ayrıca, her bir dize için, dizenin uzunluğuna bölünen alt dizinin sıklığı, büyük olacak şekilde hesaplanabilir.

Şimdiden teşekkürler.

cevap

8

Bunu kullanarak 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 

çözüldü Ve son bölümü için sorusuna, hesaplama frekans/dize uzunluğu ...

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

It nece olduğunu ssary, df $ x'i bir karakter dizesine dönüştürür çünkü data.frame (x, freq), dizeleriAsFactors = F belirtmediğiniz sürece otomatik olarak dizeleri dönüştürür. (Değil tabanında R yüklemek gerçi)

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

bu harika teşekkürler. Dizinin uzunluğunu hesapladığınızı fark ettim - data.frame'de frekans/uzunluk diyebilir miyim? Bu çok yararlı olurdu. Teşekkürler. – brucezepplin

+0

oh üzgünüm - demek istediğim, her dizge için dizginin uzunluğuna bölünen alt dizinin sıklığını döndürebilir miyim? – brucezepplin

+0

Üzgünüz - I; m Alma Hatası (df $ x): 'nchar()' bir karakter vektörü gerektirir – brucezepplin

7

Yanlış bir araç kullanıyorsunuz. Size arama dizesi bulundu pozisyonunu (veya -1 bulunamadı değilse), hangi gregexpr deneyin:

> 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 
+0

çok teşekkürler, bu çok yardımcı oldu. – brucezepplin

+0

pozisyonu aslında benim için şimdi çok yararlı olduğunu düşünüyorum. Teşekkürler. – brucezepplin

3

Sen qdap kullanabilirsiniz: çıktı kelime sayısının kıyasla frekans ve frekansa sahip olduğunu

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%) 

Not (çıkış aslında bir liste ama oldukça yazdırır çıktı). frekansları erişmek için:

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 
2

base r bu basit tek liner strsplit yararlanır ve ardından grepl ve oldukça sağlam, ama jj ait jjjjjj 3 olarak birçok gibi eşleşmeleri saymak varsa kıracak. Bunu mümkün kılan desen maç @JoshOBriens excellent Q&A şöyledir:

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 
+0

bu önemli bir noktaya işaret ediyor - kabul edilen cevap bunu çözdü. Eğer "jjjjjj" olsaydı ben 3 frekansını geri dönmek istiyorum. Ancak, bu bana sık sık 5 frekans veren çakışmalara izin verdiyse bu bir sorun olurdu. Neyse ki bu durum böyle değil! Ama bunun için teşekkürler. – brucezepplin