Подтвердить что ты не робот

Заменить примеры функций

Я не могу найти справочную страницу для функции replace из пакета base. Хуже того, в нем нет примеров, которые могли бы помочь понять, как это работает.

Не могли бы вы объяснить, как его использовать? Пример или два были бы замечательными.

4b9b3361

Ответ 1

Если вы посмотрите на функцию (набрав ее имя на консоли), вы увидите, что это просто простая функционализованная версия функции [<-, описанная в ?"[". [ является довольно базовой функцией для R, поэтому вам будет полезно ознакомиться с этой страницей для получения дополнительной информации. Особенно важно узнать, что аргумент индекса (второй аргумент в replace может быть логическим, числовым или символьным значением. Утилизация будет происходить, когда существуют разные длины второго и третьего аргументов:

> replace( 1:20, 10:15, 1:2)
 [1]  1  2  3  4  5  6  7  8  9  1  2  1  2  1  2 16 17 18 19 20

Индексирование символов для именованного вектора:

> replace(c(a=1, b=2, c=3, d=4), "b", 10)
 a  b  c  d 
 1 10  3  4 

Логическое индексирование:

> replace(x <- c(a=1, b=2, c=3, d=4), x>2, 10)
 a  b  c  d 
 1  2 10 10 

Ответ 2

Вы также можете использовать логические тесты

x <- data.frame(a = c(0,1,2,NA), b = c(0,NA,1,2), c = c(NA, 0, 1, 2)) 
x
x$a <- replace(x$a, is.na(x$a), 0)
x
x$b <- replace(x$b, x$b==2, 333)

Ответ 3

Здесь два простых примера

> x <- letters[1:4]
> replace(x, 3, 'Z') #replacing 'c' by 'Z'
[1] "a" "b" "Z" "d"
> 
> y <- 1:10
> replace(y, c(4,5), c(20,30)) # replacing 4th and 5th elements by 20 and 30
 [1]  1  2  3 20 30  6  7  8  9 10

Ответ 4

Помните, что третий параметр (значение) в приведенных выше примерах: значение является константой (например, "Z" или c (20, 30)).

Определение третьего параметра с использованием значений из самого кадра данных может привести к путанице.

например. с простым фреймом данных, таким как это (с использованием dplyr:: data_frame):

tmp <- data_frame(a=1:10, b=sample(LETTERS[24:26], 10, replace=T))

Это создаст нечто вроде этого:

       a     b
   (int) (chr)
1      1     X
2      2     Y
3      3     Y
4      4     X
5      5     Z

.. и т.д.

Теперь предположим, что вы хотите, чтобы это было сделано, заключалось в том, чтобы умножить значения в столбце "a" на 2, но только там, где столбец "b" равен "X". Моя непосредственная мысль была бы такой:

with(tmp, replace(a, b=="X", a*2))

Это не даст желаемого результата. A * 2 будет определяться как фиксированный вектор, а не ссылка на столбец "a" . Таким образом, вектор 'a * 2' будет

[1]  2  4  6  8 10 12 14 16 18 20

в начале операции "replace". Таким образом, первая строка, где "b" равна "X", значение в "a" будет помещаться на 2. Второй раз он будет заменен на 4 и т.д.... он не будет заменен на два раза -the-value-of-a в этой конкретной строке.

Ответ 5

Вот пример, где я нашел функцию replace() полезной для того, чтобы дать мне понимание. Задача потребовала, чтобы длинный целочисленный вектор был изменен на вектор символов и его целые числа заменены заданными значениями символов.

## figuring out replace( )
(test <- c(rep(1,3),rep(2,2),rep(3,1)))

который выглядит

[1] 1 1 1 2 2 3

и я хочу заменить каждый 1 на A и 2 на B и 3 с помощью C

letts <- c("A","B","C")

поэтому в моем собственном тайном маленьком "грязном стихе" я использовал петлю

for(i in 1:3)
{test <- replace(test,test==i,letts[i])}

который сделал то, что я хотел

test
[1] "A" "A" "A" "B" "B" "C"

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

Таким образом, другой способ выполнения приложения replace() здесь

(test <- factor(test,labels=letts))
[1] A A A B B C
Levels: A B C