2013-03-21 10 views
5

YARQ(さらに別の正規表現質問)。最後の文章で列を分割する

次の2つの列に分割すると、最後の列には文の最後の単語が含まれ、最初の列にはその他すべてが含まれていることを確認します。

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

私はで終わるような「言葉」を仮定し

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

答えて

9

これは先を見越す仕事のようです。私たちは、スペースではなく、スペースでないものを見つけるでしょう。

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

かで結果のsapply

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

を使用して代替実装:

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と速度のチェックマーク(rep(10k)= 0.05s) –

1

この場合の最後の言葉は、1つまたは文字\\wまたは数字\\dです(英数字あり、必要であれば、あなたはより多くのクラスを追加することができます):

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

出力:

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

これは動作しているようですが、最後の「単語」に「 - 」が含まれていれば、それを考慮しません。私は私の例を更新しています。 –

+0

これは私の説明で私が得ようとしていたものです。言葉に何があるのか​​正確には分からないので、私は '\\ w \\ d'を使いました。 '\\ S'でその部分を置き換える方が良いかもしれません:空白でない文字。 – Marius

+0

'\\ W \\ d'を' \\ S'に置き換えてもうまくいきませんでした。これは、ハイフネーションされた終了語を除いて機能します。 –

4

はここstrsplitを使用して、外出先だ

 [,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は完全に機能します。 –

0

これがない場合がありますまさにあなたのためではなく、場合には、誰のpythonでこれを行う方法をを思っていた:

:COL1は、あなたがこのような文字列の中に作ることができるリストとして印刷されますことを
#col1: 
print line.split(" ")[:-1] 

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

#col1: 
print " ".join(line.split(" ")[:-1]) 
関連する問題