Xóa một phần của chuỗi


90

Làm cách nào để xóa một phần của chuỗi? Ví dụ trong ATGAS_1121Tôi muốn xóa mọi thứ trước đây _.

Câu trả lời:


131

Sử dụng biểu thức chính quy. 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 khớp với phần đầu của chuỗi (^), bất kỳ ký tự nào (.) Được lặp lại không hoặc nhiều lần (*) và dấu gạch dưới (_). Các ? làm cho trận đấu trở nên "lười biếng" để nó chỉ có những trận đấu cách điểm gạch dưới đầu tiên. Trận đấu đó được thay thế chỉ bằng một dấu gạch dưới. Xem ?regexđể biết thêm chi tiết và tham khảo


6
Regex trước sẽ phù hợp với gạch cuối cùng trong trường hợp, ví dụ như, gsub("^.*_","_","ATGAS_1121_xxx"). Hiện đã được sửa.
Richie Cotton

7
@Joshua Tôi thấy thực sự hữu ích khi bạn giải thích vai trò của các biểu thức chính quy.
Vasile

Điều này cũng hoạt động với một vector chuỗi làm đối số cuối cùng. R thật tuyệt vời như thế.
naught101

37

Bạn có thể sử dụng một công cụ tích hợp cho việc này, strsplit :

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

strsplit trả về cả hai phần của chuỗi được phân tích cú pháp trên tham số tách 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 đặt lời gọi ở trạng thái không công khai , sau đó lập chỉ mục mảng đó để chỉ phần tử thứ hai trong hai phần tử trong vectơ được trả về.

Cuối cùng, tham số cố định phải được đặt thành TRUE để chỉ ra rằng tham số tách không phải là một biểu thức chính quy, mà là một ký tự khớp theo nghĩa đen.


23

Nếu bạn thuộc tuýp người Tidyverse, đâ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"

21

Đây là strsplitgiải pháp nếu slà một vectơ:

> 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 dấu '_'), thay thế [2] ở cuối bằng [1].
stevenjoe

4

Có lẽ giải pháp trực quan nhất có lẽ là sử dụng stringrhàm str_removethậm chí còn dễ hơn str_replacevì nó chỉ có 1 đối số thay vì 2.

Phần khó duy nhất trong ví dụ của bạn là bạn muốn giữ lại dấu gạch dưới nhưng có thể: Bạn phải đối sánh biểu thức chính quy cho đến khi nó tìm thấy mẫu chuỗi được chỉ định (?=pattern).

Xem ví dụ:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"

3

Đây là strsplitgiải pháp cho khung dữ liệu sử dụng dplyrgó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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.