Как заменить значения в таблице в R

у меня есть два фрейма данных, один с "закодированными" значениями и другой, который действует как словарь:

> head( encoded_values )
value
1
2
1
3

> head( dict )
id    name
1     foo
2     bar
3     baz

Я хочу заменить значения в первом фрейме данных с "декодированными" значениями, просматривая второй фрейм данных. Это должно быть результатом:

> head( encoded_values )
foo
bar
foo
baz

Я нашел много подобных постов, но ничего конкретного для моего случая. Может быть, это довольно распространенная операция, но я очень новичок в R и совершенно потерян со всеми многими возможностями, которые я пробовал так далеко (ничего из этого не сработало).

большое спасибо.

2 ответов


это match (обратите внимание, намного быстрее, чем merge) предназначен для:

dict[match(encoded_values$value, dict$id), 2, drop=F]

производит (нам нужны drop=F так что data.frame возвращается вместо вектора, так как мы выбираем только один столбец):

    name
1    foo
2    bar
1.1  foo
3    baz

match возвращает расположение значений в первом аргументе, во втором аргументе. Затем вы можете использовать это для индексации второго аргумента.

на самом деле заменить:

encoded_values$value <- with(dict, name[match(encoded_values$value, id)])

Примечание, в это простой случай, потому что ваши идентификаторы совпадают с номерами строк в dict, вы также можете сделать:

dict[encoded_values$value, 2, drop=F]

но это работает только из-за особого характера id переменная dict (начинается с 1, с шагом 1 каждый).


на всякий случай, если ваш encoded_values это матрица Multi-колонки, вы также можете попробовать это,

words_mapped <- matrix(with(dict, name[match(encoded_values[ ,1:ncol(encoded_values)], id)]), nrow = nrow(encoded_values))

это также будет работать для одного вектора столбца в вашей проблеме. ура!