Làm cách nào để xóa một phần của chuỗi? Ví dụ trong ATGAS_1121
Tôi muốn xóa mọi thứ trước đây _
.
Câu trả lời:
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
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.
Đây là strsplit
giải pháp nếu s
là một vectơ:
> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
Có lẽ giải pháp trực quan nhất có lẽ là sử dụng stringr
hàm str_remove
thậm chí còn dễ hơn str_replace
vì 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"
Đây là strsplit
giải pháp cho khung dữ liệu 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
gsub("^.*_","_","ATGAS_1121_xxx")
. Hiện đã được sửa.