Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

replace string in dataframe

I'm trying to replace a certain string in a large data.frame. I just found the following solution but gsub doesn't preserve the original data.frame layout. How can I achieve this.

I mean I want to replace a string and don't want to change the layout of the df.

Consider this example:

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

like image 541
rainer Avatar asked May 14 '13 10:05

rainer


2 Answers

You will want to lapply through your data.frame testing for character or factor entries and then applying gsub appropriately. The result will be a list, but as.data.frame fixes this.

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"
like image 81
James Avatar answered Sep 27 '22 21:09

James


as.data.frame(sapply(test, function(x) gsub("a", "new", x)))
like image 36
Thomas Avatar answered Sep 27 '22 21:09

Thomas