Условная замена значений столбца данными.таблица

#r #data.table

#r #данные.таблица

Вопрос:

У меня есть следующие данные.таблица:

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

Теперь я хочу заменить все 1 в col2 значением «BigDog». Я могу сделать это, используя дух data.frame:

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

Но мне интересно, есть ли другой способ, более «ориентированный на данные.таблицу»?

Ответ №1:

Если бы вы не хотели изменять тип столбца, вы бы сделали:

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

С изменением типа вы можете сделать:

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

Если вы сначала не измените тип, «BigDog» будет преобразован в integer, т.е. NA . Вы также, конечно, получите кучу предупреждений по этому поводу.

Обратите внимание, что помимо менее громоздкого синтаксиса, использование := имеет то преимущество, что не создает дополнительных копий данных (как <- будет), а вместо этого изменяет на месте.

Комментарии:

1. Предполагая, что я не хочу менять тип столбца, как я могу применить первое использование к нескольким (именованным) столбцам?

2. @rimorob уверен — dt[condition,`:=`(col2 = 123, col3 = 234, ...)]

3. Как насчет выполнения нескольких условий одновременно в одном столбце? Например. изменение 1 на «BigDog» и 2 на «smallDog»?

Ответ №2:

Дополнительно вы могли бы использовать библиотеку 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"))