Я не могу найти справочную страницу для функции replace
из пакета base
. Хуже того, в нем нет примеров, которые могли бы помочь понять, как это работает.
Не могли бы вы объяснить, как его использовать? Пример или два были бы замечательными.
Я не могу найти справочную страницу для функции replace
из пакета base
. Хуже того, в нем нет примеров, которые могли бы помочь понять, как это работает.
Не могли бы вы объяснить, как его использовать? Пример или два были бы замечательными.
Если вы посмотрите на функцию (набрав ее имя на консоли), вы увидите, что это просто простая функционализованная версия функции [<-
, описанная в ?"["
. [
является довольно базовой функцией для 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
Вы также можете использовать логические тесты
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)
Здесь два простых примера
> 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
Помните, что третий параметр (значение) в приведенных выше примерах: значение является константой (например, "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 в этой конкретной строке.
Вот пример, где я нашел функцию 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