2013-09-23 47 views
7

我想將CIGAR矢量摺疊爲CIGAR字符串。通過CIGAR向量爲String我的意思是以下情況:摺疊雪茄矢量到字符串或摺疊字符的向量與各自的數字字符串

我想,其轉換功能:

cigar.vector = c("M", "M", "I", "I", "M", "I", "", "M", "D", "D", "M", "I", "D", "M", "I") 

這樣:

cigar.string = "2M2I1M1I1M2D1M1I1D1M1I" 

,反之亦然。

請注意,有一個「」(空字符),不計算。謝謝!

回答

13

rle似乎是顯而易見的選擇,在這裏:

rcv <- rle(cigar.vector[cigar.vector!=""]) 
paste0(rcv$lengths,rcv$values,collapse="") 
#[1] "2M2I1M1I1M2D1M1I1D1M1I" 

如果你想獲得幻想,你也可以利用以下事實:rle給出長度爲2的列表:

paste(do.call(rbind,rle(cigar.vector[cigar.vector!=""])),collapse="") 
#[1] "2M2I1M1I1M2D1M1I1D1M1I" 

倒退會如果僅給出結果(上面指定爲result),則不可能,因爲它已經丟失了""個案的信息。不包括這些情況,你可以用類似的東西得到足夠接近:

backwards <- rep(
    unlist(strsplit(result,"\\d+"))[-1], 
    as.numeric(unlist(strsplit(result,"[^0-9]"))) 
) 
identical(cigar.vector[cigar.vector!=""],backwards) 
#[1] TRUE 
+2

+1太快的人,打我19秒! –

+0

@thelatemail非常感謝,作品完美。 Jilber也感謝你,我也看到了你的答案:-) – Dnaiel

+2

我必須在我的競選活動後面加入一些動力,在fortunes文件中添加「如果有疑問,請使用rle」:-) –