Как заменить значения в таблице в 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))
это также будет работать для одного вектора столбца в вашей проблеме. ура!