#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"))