2011-06-04 37 views
11

Tôi có dữ liệu trong R có thể trông như thế này:Cụm từ thông dụng trong R để xóa tất cả ký tự sau khoảng trắng đầu tiên?

USDZAR Curncy 
R157 Govt 
SPX Index 

Nói cách khác, một từ, trong trường hợp này một định danh an ninh Bloomberg, tiếp theo là một từ khác, mà là lớp an ninh, ngăn cách bởi một không gian . Tôi muốn loại bỏ lớp học và không gian để đến:

USDZAR 
R157 
SPX 

Cách hiệu quả nhất để làm điều này trong R là gì? Là biểu thức thông thường hay tôi phải làm một cái gì đó như tôi sẽ trong MS Excel bằng cách sử dụng các lệnh giữa và tìm? ví dụ: trong Excel, tôi sẽ nói:

=MID(@REF, 1, FIND(" ", @REF, 1)-1) 

có nghĩa là trả lại chuỗi con bắt đầu từ ký tự 1 và kết thúc ở số ký tự của dấu cách đầu tiên (ít hơn 1 để xóa khoảng trắng).

Tôi có cần phải làm điều gì đó tương tự trong R (trong trường hợp này, điều tương đương), hoặc biểu thức chính quy có thể trợ giúp ở đây không? Cảm ơn.

Trả lời

23

1) Cố gắng này, nơi các biểu thức chính quy phù hợp với một không gian tiếp theo bất kỳ chuỗi ký tự và sub sẽ thay thế bằng một chuỗi có zero ký tự:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 
sub(" .*", "", x) 
## [1] "USDZAR" "R157" "SPX" 

2) Một thay thế nếu bạn muốn hai từ trong các cột riêng biệt trong một khung dữ liệu như sau. Ở đây as.is = TRUE làm cho các cột là ký tự chứ không phải là yếu tố.

read.table(text = x, as.is = TRUE) 
##  V1  V2 
## 1 USDZAR Curncy 
## 2 R157 Govt 
## 3 SPX Index 
+0

Cảm ơn bạn. –

1

Các regex sẽ được tìm kiếm:

\x20.* 

và thay thế bằng một chuỗi rỗng.

Nếu bạn muốn biết liệu nó có nhanh hơn không, chỉ cần thời gian.

+0

Cảm ơn, đúng vì vậy tôi gõ: ("\ x20 *", "R157 Govt")> grep và tôi nhận được trở lại: [1] 1, tức là giá trị 1. Tôi đi đâu từ đó? –

+0

loại regex này không hoạt động tốt với R. –

+0

Vấn đề với việc sử dụng đó là bạn không hiểu rằng dấu gạch chéo ngược là đặc biệt trong regex và do đó cần phải được "thoát" chính nó. Và nó cần phải có HAI ba lô trước khi nó trong đối số mẫu. Thử: 'sub (" \\\ x20. * "," "," R157 Govt ")' –

2

Nếu bạn đang như tôi, ở của regexp rằng sẽ luôn luôn vẫn là một bí hiểm, bực bội bí ẩn, giải pháp clunkier này cũng tồn tại:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 
unlist(lapply(strsplit(x," ",fixed=TRUE),"[",1)) 

Các cố định = TRUE không thực sự cần thiết, chỉ cần chỉ ra rằng bạn có thể làm điều này (trường hợp đơn giản) w/out thực sự biết điều đầu tiên về regexp.

Đã chỉnh sửa để phản ánh nhận xét của @ Wojciech.

+0

haha ​​yes - cảm ơn joran. Clunk phong cách là những gì tôi đang sử dụng để trong Excel vì vậy tôi đã tự hỏi nếu tôi nên (cuối cùng) tìm hiểu regexs. –

+0

chức năng ẩn danh là không cần thiết ở đây, vì vậy bạn có thể đơn giản hóa để unlist (lapply (strsplit (x, "", cố định = TRUE), "[", 1)). –

+0

Cảm ơn @Wojciech, tôi sẽ chỉnh sửa tương ứng ... – joran

4

Nó khá dễ dàng với stringr:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 

library(stringr) 
str_split_fixed(x, " ", n = 2)[, 1] 
Các vấn đề liên quan