2013-08-15 21 views
5

Tôi cần thay chuỗi A bằng chuỗi B, chỉ khi chuỗi A là toàn bộ từ (ví dụ: "MECH") và tôi không muốn thay thế khi A là một phần của chuỗi dài hơn (ví dụ: "MECHANICAL"). Cho đến nay, tôi có một grepl() mà kiểm tra xem chuỗi A là một chuỗi toàn bộ, nhưng tôi không thể tìm ra cách để thay thế. Tôi đã thêm một ifelse() với ý tưởng để làm cho gsub() thay thế khi grep() trả về TRUE, nếu không sẽ không thay thế. Bất kỳ đề xuất? Vui lòng xem mã bên dưới. Cảm ơn.Cụm từ thông dụng để tìm và thay thế có điều kiện

aa <- data.frame(type = c("CONSTR", "MECH CONSTRUCTION", "MECHANICAL CONSTRUCTION MECH", "MECH CONSTR", "MECHCONSTRUCTION")) 

from <- c("MECH", "MECHANICAL", "CONSTR", "CONSTRUCTION") 
to <- c("MECHANICAL", "MECHANICAL", "CONSTRUCTION", "CONSTRUCTION") 

gsub2 <- function(pattern, replacement, x, ...) { 
    for(i in 1:length(pattern)){ 
    reg <- paste0("(^", pattern[i], "$)|(^", pattern[i], ")|(", pattern[i], "$)|(", pattern[i], ")") 
    ifelse(grepl(reg, aa$type), 
      x <- gsub(pattern[i], replacement[i], x, ...), 
      aa$type) 
    } 
    x 
} 

aa$title3 <- gsub2(from, to, aa$type) 

Trả lời

2

Bạn có thể kèm theo các chuỗi trong from vector trong \\<\\> chỉ khớp nguyên dòng chữ:

x <- c("CONSTR", "MECH CONSTRUCTION", "MECHANICAL CONSTRUCTION MECH", 
     "MECH CONSTR", "MECHCONSTRUCTION") 

from <- c("\\<MECH\\>", "\\<CONSTR\\>") 
to <- c("MECHANICAL", "CONSTRUCTION") 

for(i in 1:length(from)){ 
    x <- gsub(from[i], to[i], x) 
} 

print(x) 
# [1] "CONSTRUCTION"      "MECHANICAL CONSTRUCTION"   
# [3] "MECHANICAL CONSTRUCTION MECHANICAL" "MECHANICAL CONSTRUCTION"   
# [5] "MECHCONSTRUCTION" 
+0

Tôi nhận thấy trong phần tử 5 nó không thay thế MECH. Nó có phải không? –

0

Tôi sử dụng regex (?<=\W|^)MECH(?=\W|$) để nhận được nếu bên trong chuỗi chứa toàn bộ từ MECH như this.

Đó có phải là những gì bạn cần không?

0

Chỉ cần cho hậu thế, khác so với sử dụng các \< \> bao vây, toàn bộ một từ có thể được định nghĩa là bất kỳ chuỗi kết thúc trong một không gian hoặc cuối dòng (\s|$).

gsub("MECH(\\s|$)", "MECHANICAL\\1", aa$type) 

Vấn đề duy nhất với phương pháp này là bạn cần phải thực hiện trong không gian hoặc end-of-line mà bạn sử dụng như một phần của trận đấu, vì thế mà đóng gói trong ngoặc đơn và backreference (\1).

Bao vây \< \> vượt trội hơn cho câu hỏi cụ thể này, vì bạn không có ngoại lệ đặc biệt. Tuy nhiên, nếu bạn có ngoại lệ, tốt hơn là sử dụng một phương pháp rõ ràng hơn. Càng có nhiều công cụ trong hộp công cụ của bạn thì càng tốt.

+0

hoặc dấu phẩy hoặc dấu chấm phẩy hoặc dấu chấm phẩy, v.v. – eddi

+0

@eddi Yep, bạn phải rõ ràng. Có cả ưu và khuyết điểm để được rõ ràng. Đó là sự linh hoạt cũ so với sự cân bằng tốc độ. – Dinre

Các vấn đề liên quan