2013-03-21 23 views
5

YARQ (Henüz başka regex soru).Bölünmüş sütun

Nasıl, iki sütuna aşağıdaki bölme Son sütun cümledeki son sözü içerir ve ilk sütun her şeyi içerir emin olmaktır gider. Ben ile sonuna kadar

x <- c("This is a test", 
     "Testing 1,2,3 Hello", 
     "Foo Bar", 
     "Random 214274(%*(^(* Sample", 
     "Some Hyphenated-Thing" 
     ) 

Böyle: "kelimeleri" varsayarsak

col1       col2 
this is a     test 
Testing 1,2,3    Hello 
Foo       Bar 
Random 214274(%*(^(*   Sample 
Some       Hyphenated-Thing 

cevap

9

Bu, ileriye bakmak için bir işe benziyor. Boşluk olmayan şeyler izleyen alanları buluruz.

do.call(rbind, 
    lapply(
    strsplit(x," "), 
    function(y) 
     cbind(paste(head(y,length(y)-1),collapse=" "),tail(y,1)) 
    ) 
) 

Veya sonuçlanan sapply

t(
    sapply(
    strsplit(x," "), 
    function(y) cbind(paste(head(y,length(y)-1),collapse=" "),tail(y,1)) 
) 
) 

kullanarak alternatif bir uygulama:

split <- strsplit(x, " (?=[^ ]+$)", perl=TRUE) 
matrix(unlist(split), ncol=2, byrow=TRUE) 

    [,1]     [,2]    
[1,] "This is a"   "test"    
[2,] "Testing 1,2,3"  "Hello"   
[3,] "Foo"     "Bar"    
[4,] "Random 214274(%*(^(*" "Sample"   
[5,] "Some"     "Hyphenated-Thing" 
+0

+1 ve hız için onay işareti (rep (10k) = 0,05 s) –

1

(bu durumda son söz gerekirse bir veya harfler \\w veya rakam \\d, daha fazla sınıfları ekleyebilir alfanümerik olduğunu edilir):

col_one = gsub("(.*)(\\b[[\\w\\d]+)$", "\\1", x, perl=TRUE) 
col_two = gsub("(.*)(\\b[[\\w\\d]+)$", "\\2", x, perl=TRUE) 

Çıktı:

> col_one 
[1] "This is a "   "Testing 1,2,3 "  "Foo "     
[4] "Random 214274(%*(^(* " 
> col_two 
[1] "test" "Hello" "Bar" "Sample" 
+0

Bu çalışıyor gibi görünüyor, ancak geçen "kelime" eğer sahip bir '-' içinde, bunun için hesap değil. Örneğimi güncelliyorum. –

+0

Açıklamamla ilgili anlatmaya çalıştığım şey buydu: Ben tam olarak bu kelimelerde ne olabileceğinden emin değildim, bu yüzden '\\ w \\ d' kullandım. Bu parçayı "\\ S" ile değiştirmek daha iyi olabilir: beyaz boşluk olmayan herhangi bir karakter. – Marius

+0

'\\ W \\ d' ile' \\ S' arasında değişiklik yapmak benim için çalışmadı. Bu, tirelenmiş son sözcükler haricinde çalışır. –

4

İşte strsplit kullanarak gitmek var

 [,1]     [,2]    
[1,] "This is a"   "test"    
[2,] "Testing 1,2,3"  "Hello"   
[3,] "Foo"     "Bar"    
[4,] "Random 214274(%*(^(*" "Sample"   
[5,] "Some"     "Hyphenated-Thing" 
+0

+ 1 tamamen işlevsel. –

0

Bu olmayabilir Tam olarak sizin için olabilir, ama durumda herkes piton yılında bunun nasıl merak ediyorum:

: col1 böyle bir dizeye yapabilir bir liste olarak basılmış olsun edeceğini
#col1: 
print line.split(" ")[:-1] 

#col2: 
print line.split(" ")[-1] 

Not

#col1: 
print " ".join(line.split(" ")[:-1])