Можете ли вы объяснить, как функция замены рассчитывает длину вектора? - PullRequest
3 голосов
/ 10 июня 2019

Я использую функцию замены для замены чисел символами в списке, но, похоже, нужно добавить дополнительное значение в список индексов, чтобы код работал.(См. Пример)

Простая версия проблемы состоит в том, что у меня есть список (0,1), и я хочу заменить 0 на «a» и 1 на «b».

replace(0:1, 0:1, c("a","b"))

Создает следующие результаты

[1] "a" "1"
Warning message:
In x[list] <- values :
  number of items to replace is not a multiple of replacement length

при расширении списка индексов до 0: 2 я получаю желаемый результат

> replace(0:1, 0:2, c("a","b"))
[1] "a" "b"

Я, очевидно, не понимаю, какфункция замены работает, но я не могу понять, чего мне не хватает.

1 Ответ

1 голос
/ 10 июня 2019

Второй аргумент для замены - это список индексов (не значений), а R использует индексирование на основе 1.0: 1 содержит только 1 действительный индекс.Таким образом,

replace(0:1, 0:1, c("a","b"))

фактически эквивалентен

replace(0:1, 1, c("a","b"))

, который генерирует предупреждающее сообщение.

Похоже, вы действительно ищете функциональность mapvalues ​​ из пакета plyr.Например,

x <- c(2,3,5,7,11)
plyr::mapvalues(x,c(3,7),c(10,12))

, который приводит к выводу:

[1]  2 10  5 12 11

mapvalues является примером функции plyr, у которой нет прямого аналога в новом пакете dplyr,См. этот вопрос .Использование обоих пакетов одновременно не рекомендуется.Вот почему я использовал более явный plyr::mapvalues(), а не сначала library(plyr), а затем просто mapvalues().

...