Заменить заданное значение в векторе - программирование
Подтвердить что ты не робот

Заменить заданное значение в векторе

Я ищу функцию, которая заменит все вхождения одного значения на другое значение. Например, я хотел бы заменить все нули на них. Я не хочу хранить результат в переменной, но хочу иметь возможность использовать вектор анонимно как часть большего выражения.

Я знаю, как написать подходящую функцию:

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

4b9b3361

Ответ 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 - это быстрый и простой способ сделать это.