2012-06-13 14 views
15

R'de hangi bir strsplit işlevi, dizenin geri kalanını vektörlere bölmek için belirli bir düzenli ifadeyi eşleştirir ve siler.Öğeleri strsplit kullanarak nasıl bölmeli ve tutmalıyım?

>strsplit("abc123def", "[0-9]+") 
[[1]] 
[1] "abc" "" "" "def" 

Ancak, dizeyi düzenli ifadeyi kullanarak aynı şekilde nasıl ayırmalıyım, aynı zamanda eşleşmeleri nasıl saklamalıyım? Aşağıdaki gibi bir şeye ihtiyacım var. strapply kullanma

>FUNCTION("abc123def", "[0-9]+") 
[[1]] 
[1] "abc" "123" "def" 

("abc123def", "[0-9] + | [az] +") burada çalışır, ancak maçların dışında dize geri kalanı normal ifade tarafından yakalanan edilemez ne olur ?

+0

Sen desen kullanarak tüm karakterleri yakalayabilir "[0-9] + | [^ 0-9] +" veya diğer her şeyi yakalamak ve fonksiyon EĞLENCE = işlevini kullanarak çıkışından iptal için desen uzatmak (x) ise (grepl ("^ [0-9a-z] + $", x)) x –

+0

Merhaba, SO için yeni olduğunuzu görüyorum. Sorunun çözüldüğünü düşünüyorsanız, lütfen yeşil onay işaretini tıklayarak 'kabul edildi' olarak işaretleyin. Bu, hala cevapları olmayan eski SO'ya odaklanmaya yardımcı olur. http://meta.stackexchange.com/questions/88535/asking-for-someone-to-accept-your-answer/135824#135824 –

cevap

22

Temelde, ne istediğiniz [0-9]+ üzerinde bölmek ancak [0-9]+ ve her şey arasındaki geçiş üzerinde bölmek için değil geliyor bana. Dizinizde, bu geçiş önceden mevcut değil. eklemek için, gsub ile-sürecini önceden olabilir ve arka referanslamaya:

test <- "abc123def" 
strsplit(gsub("([0-9]+)","~\\1~",test), "~") 

[[1]] 
[1] "abc" "123" "def" 
+0

Geri referans ifadesinden asla haberi olmadı. İstediğim buydu ve çok teşekkürler. – jackson

+0

Doğru sorunu çözdüğüne sevindim :-) –

+1

Gerçekten şık bir numara! – voidHead

2

Sen gsubfn paketten strapply kullanabilirsiniz.

test <- "abc123def" 
strapply(X=test, 
     pattern="([^[:digit:]]*)(\\d+)(.+)", 
     FUN=c, 
     simplify=FALSE) 

[[1]] 
[1] "abc" "123" "def" 
5

Çevresel değerlendirmeler kullanabilirsiniz.

> test <- "abc123def" 
> strsplit(test, "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)", perl=T) 
[[1]] 
[1] "abc" "123" "def" 
+6

Neden düşüş var? Bu giriş için mükemmel çalışır. –

+1

+1: Sadece işe yaramaz, bu çözümü çok daha şık buluyorum! Artı veya eksi operatörü ile karşılaştığınızda formülleri ayırmak istediğiniz bir durumu düşünün. Aralarında düzenlemek istediğiniz değişken isimlere sahipsiniz. Bu nedenle, onu bölebilirsiniz, operatörleri ayrı dizeler olarak saklayabilir, değişken adlarını düzenleyebilir ve daha sonra tüm dizeleri yeniden birleştirebilirsiniz. Artı ve eksi operatörleri kaybetmeden bu çözüm ile mükemmel çalışır! – ToJo

İlgili konular