2013-05-14 28 views
5

Tôi đang cố gắng thay thế một chuỗi nhất định trong một tệp dữ liệu lớn. Tôi chỉ tìm thấy giải pháp sau nhưng gsub không giữ nguyên bố cục dữ liệu ban đầu. Làm thế nào tôi có thể đạt được điều này.thay thế chuỗi trong dataframe

Tôi muốn thay thế một chuỗi và không muốn thay đổi bố cục của df.

Hãy xem xét ví dụ sau:

test<-data.frame(a=c("a","b","c","d"),b=c("a","e","g","h"),c=c("i","j","k","a")) 
gsub("a","new",test) 

Thx

Trả lời

14

Bạn sẽ muốn lapply thông qua thử nghiệm data.frame của bạn cho character hoặc factor mục và sau đó áp dụng một cách thích hợp gsub. Kết quả sẽ là list, nhưng as.data.frame sẽ khắc phục sự cố này.

test$val <- 1:4 # a non character/factor variable 
(test2 <- as.data.frame(lapply(test,function(x) if(is.character(x)|is.factor(x)) gsub("a","new",x) else x))) 
    a b c val 
1 new new i 1 
2 b e j 2 
3 c g k 3 
4 d h new 4 
class(test2$val) # to see if it is unchanged 
[1] "integer" 
+0

tại sao bạn quấn toàn bộ biểu thức trong dấu ngoặc vuông? –

+3

@RichardSmith Điều đó làm cho biểu thức trả về kết quả của nó một cách rõ ràng với bàn điều khiển. Nhiệm vụ thường được trả lại vô hình. – James

6
as.data.frame(sapply(test, function(x) gsub("a", "new", x))) 
+0

cảm ơn, nhưng điều đó mang lại cho tôi ma trận ký tự, df của tôi cũng có giá trị bằng số, sau đó tôi gặp sự cố khi xử lý dữ liệu thêm – rainer

+1

Tôi vừa làm việc với ví dụ của bạn. – Thomas