आर

2015-12-01 3 views
11

का उपयोग कर तारों में लगातार पैटर्न की गणना करना मैं पैटर्न के लगातार उदाहरणों की संख्या को गिनने के लिए एक फ़ंक्शन लिखने का प्रयास कर रहा हूं। एक उदाहरण के रूप में, मैं स्ट्रिंगआर

string<-"A>A>A>B>C>C>C>A>A" 

"3 A > 1 B > 3 C > 2 A" 

मैं एक समारोह है कि प्रत्येक स्ट्रिंग के उदाहरण में गिना जाता है मिल गया है में तब्दील किया जा करना चाहते हैं, नीचे देखें। लेकिन यह ऑर्डरिंग प्रभाव प्राप्त नहीं करता है जो मैं चाहता हूं। कोई विचार या पॉइंटर्स?

धन्यवाद,

आर

मौजूदा समारोह:

fnc_gen_PathName <- function(string) { 
p <- strsplit(as.character(string), ";") 
p1 <- lapply(p, table) 
p2 <- lapply(p1, function(x) { 
sapply(1:length(x), function(i) { 
    if(x[i] == 25){ 
    paste0(x[i], "+ ", names(x)[i]) 
    } else{ 
    paste0(x[i], "x ", names(x)[i]) 
    } 
}) 
}) 
p3 <- lapply(p2, function(x) paste(x, collapse = "; ")) 
p3 <- do.call(rbind, p3) 
return(p3) 
} 
+1

क्या आपने 'rle()' फ़ंक्शन देखा है? यदि आप अपनी स्ट्रिंग को वेक्टर में विभाजित करते हैं तो अच्छी तरह से काम करना चाहिए। – MrFlick

+0

बिल्कुल सही, बहुत बहुत धन्यवाद। पहले समारोह के बारे में कभी नहीं सुना, लेकिन उपयोग करने में बहुत आसान है। –

उत्तर

10

@MrFlick द्वारा टिप्पणी की के रूप में आप की कोशिश कर सकते निम्नलिखित rle और strsplit का उपयोग कर

with(rle(strsplit(string, ">")[[1]]), paste(lengths, values, collapse = " > ")) 
## [1] "3 A > 1 B > 3 C > 2 A" 
0

यहाँ दो dplyr हैं समाधान: एक नियमित और एक राले के साथ। फायदे हैं: एक वेक्टर के रूप में कई तारों को इनपुट कर सकते हैं, (ugh) renesting से पहले एक साफ मध्यवर्ती डेटासेट बनाता है।

library(dplyr) 
library(tidyr) 
library(stringi) 

strings = "A>A>A>B>C>C>C>A>A" 


data_frame(string = strings) %>% 
    mutate(string_split = 
      string %>% 
      stri_split_fixed(">")) %>% 
    unnest(string_split) %>% 
    mutate(ID = 
      string_split %>% 
      lag %>% 
      `!=`(string_split) %>% 
      plyr::mapvalues(NA, TRUE) %>% 
      cumsum) %>% 
    count(string, ID, string_split) %>% 
    group_by(string) %>% 
    summarize(new_string = 
       paste(n, 
        string_split, 
        collapse = " > ")) 

data_frame(string = strings) %>% 
    group_by(string) %>% 
    do(.$string %>% 
     first %>% 
     stri_split_fixed(">") %>% 
     first %>% 
     rle %>% 
     unclass %>% 
     as.data.frame) %>% 
    summarize(new_string = 
       paste(lengths, values, collapse = " > "))