2013-04-18 58 views
6

Tôi có chuỗi sau:yếu tố thay thế của một vector

string <- c("100 this is 100 test 100 string") 

Tôi muốn thay thế 100 trong chuỗi ở trên với các yếu tố của véc tơ khác:

replacement <- c(1000,2000,3000) 

Đầu tiên 100 của chuỗi nên được thay thế bằng 1000, thứ hai 100 vào năm 2000 và như vậy. Chuỗi kết quả sẽ trông giống như sau:

result <- c("1000 this is 2000 test 3000 string") 

Có cách nào hiệu quả để thực hiện điều này trong R?

Cảm ơn bạn.

Ravi

+0

Vì vậy, giá trị được thay thế luôn được cố định, số lần các giá trị đó xảy ra luôn được biết, số sẽ được thay thế luôn xen kẽ với văn bản và độ dài của vector thay thế luôn khớp với số lần giá trị được thay thế xảy ra? Tôi chỉ kiểm tra "giả định cơ sở" về câu hỏi. – A5C1D2H2I1M1N2O1R2T1

+0

Hi Ananda, Để làm rõ ... giá trị được cố định ... số lần các giá trị như vậy xảy ra thay đổi từ từng trường hợp ... số được thay thế có thể là văn bản hoặc số khác ... chiều dài vectơ là luôn luôn giống nhau – Ravi

Trả lời

2

Không rất thanh lịch, nhưng điều này nên làm ..

string <- c("100 this is 100 test 100 string") 
temp <- unlist(strsplit(string, split = "\\s+")) 
replacement <- c(1000, 2000, 3000) 
temp[temp == "100"] <- replacement 
result <- paste(temp, collapse = " ") 

result 
## [1] "1000 this is 2000 test 3000 string" 
1

Dưới đây là một cách để làm điều đó với strsplit:

split <- unlist(strsplit(string, "100", fixed=TRUE)) 
split <- split[nchar(split) > 0] 
paste0(replacement, split, collapse="") 
# [1] "1000 this is 2000 test 3000 string" 

Dòng thứ hai là ở đây vì strsplit thêm một chuỗi rỗng vào đầu kết quả của nó vì 100 xuất hiện ở vị trí đầu tiên.

3

một cách:

> cs <- strsplit(string," ")[[1]] 
> cs[cs == "100"] <- replacement 
> cat(cs) 
1000 this is 2000 test 3000 string 
0

thế nào về việc sử dụng sub*apply

tail(sapply(replacement, function(x) {string <<- sub("\\b100\\b",x,string)}), 1) 
2

Một cách khác (không cần thay đổi replacement vào một danh sách):

string <- c("100 this is 100 test 100 string") 
replacement <- list(1000, 2000, 3000) 
result <- do.call(sprintf, c(gsub('100', '%d', string), replacement)) 
2

muộn để đảng, nhưng regmatches có số điện thoại regmatches(...) <- value nt chức năng cho phép bạn làm điều này loại sạch trong một liner:

regmatches(string, gregexpr("100",string)) <- list(replacement) 
string 
# [1] "1000 this is 2000 test 3000 string" 

Nếu bạn không muốn ghi đè lên bạn gốc string, bạn có thể gọi hàm trực tiếp qua:

`regmatches<-`(string, gregexpr("100",string), value=list(replacement)) 
#[1] "1000 this is 2000 test 3000 string" 
Các vấn đề liên quan