Замена данных. Табличные наблюдения; векторный подход

Я хотел бы заменить значения select в переменной data.table новым набором значений.

### Vector of old values I would like to replace
char <- c('one', 'two', 'three', 'four', 'five', 'six', 'seven')
### Vector of new values I would like to replace old values with
num <- as.character(1:7)
### Create a data.table
dt <- data.table(a = c(rep(char, each = 2), c('Something', 'Else', ' ', '')),
 b = 1:18,
 c = letters[1:18])
### Note the warning, but also that it appears to work as expected
dt[a == char, a := num]

Я получаю следующую ошибку:

Warning messages:
1: In a == char :
 longer object length is not a multiple of shorter object length
2: In `[.data.table` (dt, a == char, `:=` (a, num)) :
 Supplied 7 items to be assigned to 2 items of column 'a' (5 unused)

Мне любопытно, какой правильный способ сделать это?

Помощь приветствуется. Я действительно понимаю, что я могу добиться того же результата с помощью грубой силы:

data[var == 'Seven', var := '7']
data[var == 'Six', var := '6']
...

Но это вводит избыточность в код, а избыточность может приводить к ошибкам...

1 ответ

Использовать data.table объединяет:

replacement = data.table(a = char, new_a = num, key = "a")
dt.fixed = replacement[dt][, a := ifelse(is.na(new_a), a, new_a)][, new_a := NULL]

licensed under cc by-sa 3.0 with attribution.