2013-03-24 7 views
5

का उपयोग कर स्ट्रिंग की आवृत्ति निर्धारित करता है, तो मैं एक वेक्टरग्रेप

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

है और कार्य करें:

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

मैं:

y 
     ajjss auyjyjjksjj 
      1   1 

हालांकि दूसरी स्ट्रिंग "auyjyjjksjj" की गणना करनी चाहिए सबस्ट्रिंग "जेजे" दो बार। वास्तव में "jj" की आवृत्ति को गिनने के लिए, मैं इसे एक वास्तविक/झूठी गणना से कैसे बदल सकता हूं?

यदि प्रत्येक स्ट्रिंग के लिए स्ट्रिंग की लंबाई से विभाजित सबस्ट्रिंग की आवृत्ति की गणना की जा सकती है तो यह बहुत अच्छा होगा।

अग्रिम धन्यवाद।

उत्तर

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

की यह nece है ds $ x को वापस एक वर्ण स्ट्रिंग में कनवर्ट करने के लिए ssary क्योंकि data.frame (x, freq) तारों को तारों में स्वचालित रूप से परिवर्तित करता है जब तक आप स्ट्रिंग्सएफ़ैक्टर्स = एफ निर्दिष्ट नहीं करते।

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

यह बहुत अच्छा धन्यवाद है। मुझे लगता है कि आप स्ट्रिंग की लंबाई की गणना करते हैं - data.frame में मैं आवृत्ति/लंबाई कह सकता हूं? यह बहुत उपयोगी होगा। धन्यवाद। – brucezepplin

+0

ओह क्षमा करें - मेरा मतलब क्या है, क्या मैं प्रत्येक स्ट्रिंग के लिए स्ट्रिंग की लंबाई से विभाजित सबस्ट्रिंग की आवृत्ति के लिए वापस आ सकता हूं? – brucezepplin

+0

क्षमा करें - मुझे nchar (df $ x) में त्रुटि मिल रही है: 'nchar()' के लिए एक वर्ण वेक्टर – brucezepplin

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

बहुत बहुत धन्यवाद, यह बहुत उपयोगी था। – brucezepplin

+0

स्थिति वास्तव में मेरे लिए बहुत उपयोगी है अब मैं इसके बारे में सोचता हूं। धन्यवाद। – brucezepplin

3

आप qdap (हालांकि आधार में नहीं आर स्थापित) का उपयोग कर सकते हैं:

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 
2

base r में यह सरल एक लाइनर strsplit का उपयोग करता है और उसके बाद grepl, और काफी मजबूत है, लेकिन अगर यह jj के बहुत सारे jjjjjj 3 के रूप में की तरह मेल खाता है गिनती करने के लिए है टूट जाएगा। पैटर्न मिलान जो इसे संभव बनाता है @JoshOBriens excellent 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 
+0

यह एक महत्वपूर्ण बिंदु उठाता है - स्वीकृत उत्तर ने इसे हल किया है। अगर मेरे पास "jjjjjj" था, तो मैं 3 की आवृत्ति वापस लौटना चाहता हूं। मुझे लगता है कि अगर यह आवृत्ति गिनती में ओवरलैप की अनुमति देता है तो मुझे 5 की आवृत्ति देनी होगी। शुक्र है कि यह मामला नहीं है! लेकिन इसे इंगित करने के लिए धन्यवाद। – brucezepplin

संबंधित मुद्दे