Заменить заданное значение в векторе
Я ищу функцию, которая заменит все вхождения одного значения на другое значение.
Например, я хотел бы заменить все нули на них.
Я не хочу хранить результат в переменной, но хочу иметь возможность использовать вектор анонимно как часть большего выражения.
Я знаю, как написать подходящую функцию:
> vrepl <- function(haystack, needle, replacement) {
+ haystack[haystack == needle] <- replacement
+ return(haystack)
+ }
>
> vrepl(c(3, 2, 1, 0, 4, 0), 0, 1)
[1] 3 2 1 1 4 1
Но мне интересно, есть ли какая-то стандартная функция для выполнения этой работы, предпочтительно из пакета base
, в качестве альтернативы из другого широко используемого пакета. Я считаю, что использование такого стандарта, скорее всего, сделает мой код более удобочитаемым, и мне не придется переопределять эту функцию там, где она мне нужна.
Ответы
Ответ 1
Возможно, replace
- это то, что вы ищете:
> x = c(3, 2, 1, 0, 4, 0)
> replace(x, x==0, 1)
[1] 3 2 1 1 4 1
Или, если у вас нет x
(любая конкретная причина, почему бы и нет?):
replace(c(3, 2, 1, 0, 4, 0), c(3, 2, 1, 0, 4, 0)==0, 1)
Многие знакомы с gsub
, поэтому вы также можете попробовать одно из следующих действий:
as.numeric(gsub(0, 1, x))
as.numeric(gsub(0, 1, c(3, 2, 1, 0, 4, 0)))
Update
После прочтения комментариев возможно with
является опцией:
with(data.frame(x = c(3, 2, 1, 0, 4, 0)), replace(x, x == 0, 1))
Ответ 2
Еще один простой способ:
> x = c(1, 1, 2, 4, 5, 2, 1, 3, 2)
> x[x==1] <- 0
> x
[1] 0 0 2 4 5 2 0 3 2
Ответ 3
Чтобы заменить более одного номера:
vec <- 1:10
replace(vec, vec== c(2,6), c(0,9)) #2 and 6 will be replaced by 0 and 9.
изменить:
для непрерывного ряда, вы можете сделать это vec < - c (1:10); замените (vec, vec% в% c (2,6), c (0,9)), но для vec < - c (1:10,2,2,2,2); replace (vec, vec% in% c (2,6), 0) мы можем заменить несколько значений одним значением.
Ответ 4
Функция ifelse
- это быстрый и простой способ сделать это.