2013-03-21 19 views
5

YARQ (Còn một câu hỏi regex khác).Tách cột theo từ cuối cùng trong câu

Làm cách nào để chia nhỏ phần sau thành hai cột, đảm bảo cột cuối cùng chứa từ cuối cùng trong câu và cột đầu tiên chứa mọi thứ khác.

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

như vậy mà tôi kết thúc với:

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

Trả lời

9

Điều này trông giống như một công việc để nhìn về phía trước. Chúng tôi sẽ tìm thấy không gian theo sau là những thứ không phải là không gian.

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 và dấu kiểm cho tốc độ (đại diện (10k) = 0,05 s) –

1

Giả sử "chữ" được chữ và số (từ cuối cùng trong trường hợp này là một hoặc chữ \\w hoặc chữ số \\d, bạn có thể thêm các lớp học nếu cần thiết):

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

Output:

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

Điều này dường như đang hoạt động, nhưng nếu "từ" cuối cùng có một '-' trong đó, nó không tính đến nó. Tôi đang cập nhật ví dụ của mình. –

+0

Đó là những gì tôi đã cố gắng để có được với lời giải thích của tôi: Tôi đã không chắc chắn chính xác những gì có thể được trong các từ, vì vậy tôi đã sử dụng '\\ w \\ d'. Bạn có thể nên thay thế phần đó bằng '\\ S': bất kỳ ký tự nào không phải khoảng trắng. – Marius

+0

Thay thế '\\ W \\ d' bằng' \\ S' không hoạt động đối với tôi. Hàm này có ngoại lệ với các từ kết thúc được gạch nối. –

4

Dưới đây là một di chuyển bằng strsplit:

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

Hoặc một thực hiện thay thế sử dụng sapply

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

Hệ quả là:

 [,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 đầy đủ chức năng. –

0

này có thể không chính xác được cho bạn, nhưng trong trường hợp bất cứ ai đã tự hỏi làm thế nào để làm điều này trong python:

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

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

Lưu ý rằng col1 sẽ được in như một danh sách mà bạn có thể làm thành một chuỗi như thế này:

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