Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Conditionally replacing column values with data.table

Tags:

r

data.table

I have the following data.table:

dt <- data.table(col1 = rep("a",6), col2 = c(1,1,1,2,3,1)) 

Now I want to replace all the 1 in col2 with value "bigDog". I can do it using the data.frame spirit:

dt$col2[dt$col2==1,] <- "bigDog" 

But I wonder if there is a different way, more "data.table oriented"?

like image 250
Colonel Beauvel Avatar asked Jul 02 '14 16:07

Colonel Beauvel


2 Answers

Had you not wanted to change the type of the column, you'd do:

dt[col2 == 1, col2 := 123] 

With the type change, you can do:

dt[, col2 := as.character(col2)][col2 == "1", col2 := "bigDog"] 

If you don't change the type first, "bigDog" will get coerced to integer, i.e. NA. You'll also get a bunch of warnings about that of course.

Note that besides less cumbersome syntax, using := has the advantage of not making extra copies of data (as <- will) and instead modifies in place.

like image 151
eddi Avatar answered Sep 24 '22 11:09

eddi


Aditionally you could use the library plyr

library(data.table) library(plyr) dt <- data.table(col1 = rep("a",6), col2 = c(1,1,1,2,3,1)) dt <- mapvalues(dt[,col2], c(1), c("BigDog")) 
like image 24
jalazbe Avatar answered Sep 24 '22 11:09

jalazbe