2012-03-14 39 views

Trả lời

89

Sử dụng cụm từ thông dụng. Trong trường hợp này, bạn có thể sử dụng gsub:

gsub("^.*?_","_","ATGAS_1121") 
[1] "_1121" 

biểu thức chính quy này phù hợp với đầu của chuỗi (^), bất kỳ ký tự lặp đi lặp lại không hay nhiều lần (*) và dấu gạch dưới (_) (.). Các ? làm cho trận đấu "lười biếng" để nó chỉ phù hợp là xa như gạch dưới đầu tiên. Trận đấu đó được thay thế bằng một dấu gạch dưới. Xem ?regex để biết thêm chi tiết và tài liệu tham khảo

+5

Regex trước đó sẽ khớp với dấu gạch dưới cuối cùng trong trường hợp, ví dụ: 'gsub (" ^. * _ "," _ "," ATGAS_1121_xxx ")'. Bây giờ đã được sửa. –

+2

@Joshua Tôi thấy nó thực sự hữu ích mà bạn đã giải thích vai trò của các biểu thức thông thường. – Vasile

+0

Điều này cũng làm việc với một vectơ của chuỗi như là đối số cuối cùng. R là tuyệt vời như thế. – naught101

26

Bạn có thể sử dụng một built-in cho điều này, strsplit:

> s = "TGAS_1121" 
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2] 
> s1  
[1] "1121" 

strsplit lợi nhuận cả phần của chuỗi phân tích cú pháp trên split Tham số dưới dạng danh sách . Đó có thể không phải là những gì bạn muốn, vì vậy hãy thực hiện cuộc gọi theo số không công khai, sau đó chỉ mục mảng đó sao cho chỉ thứ hai của hai phần tử trong vectơ được trả lại.

Cuối cùng, tham số cố định phải được đặt thành TRUE để cho biết tham số chia tách không phải là cụm từ thông dụng, nhưng là ký tự khớp với chữ.

13

Đây là giải pháp strsplit nếu s là một vector:

> s <- c("TGAS_1121", "MGAS_1432") 
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2])) 
> s1 
[1] "1121" "1432" 
+2

Rất hữu ích, cảm ơn! FYI để lấy phần đầu tiên của chuỗi (tức là trước '_'), thay thế [2] ở cuối bằng [1]. – stevenjoe

3

Dưới đây là giải pháp strsplit cho một dataframe sử dụng dplyr gói

col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2) 
df 
     col1 col2 
1 TGAS_1121 T 
2 MGAS_1432 M 
3 ATGAS_1121 A 

df<-mutate(df,col1=as.character(col1)) 
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2]))) 
df2 

    col1 col2 
1 1121 T 
2 1432 M 
3 1121 A 
5

Nếu bạn là một loại Tidyverse của người, đây là Giải pháp stringr:

R> library(stringr) 
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
R> strings %>% str_replace(".*_", "_") 
[1] "_1121" "_1432" "_1121" 
# Or: 
R> strings %>% str_replace("^[A-Z]*", "") 
[1] "_1121" "_1432" "_1121" 
Các vấn đề liên quan