Функция R для процентного изменения цены

#r

Вопрос:

У меня действительно большая проблема. Я использую RSTUDIO, и моя задача-найти процентное изменение средней цены по сравнению с предыдущим днем.

Создал новый столбец PercantageCh, и я могу добавить значение сам

 bitcoin$PercentageCh[3] lt;- round((bitcoin$AverageP[3]-bitcoin$AverageP[2])/bitcoin$AverageP[2]*100, 3)  

Как автоматизировать этот процесс для всех строк 2014 года? Спасибо

введите описание изображения здесь

Ответ №1:

Вы можете сделать это с помощью diff :

 c(NA, diff(bitcoin$AverageP)) / bitcoin$AverageP # [1] NA 0.004805676 -0.011046667 0.005965718 c(NA, diff(bitcoin$AverageP) / bitcoin$AverageP[-nrow(bitcoin)]) # [1] NA 0.004828882 -0.010925971 0.006001521  

(используя bitcoin определение Мэтта).

Используйте любую версию в зависимости от того, является ли это процентным изменением по отношению к предыдущему или следующему значению. (Обратите внимание на круглые скобки и то, что находится под / оператором -, между ними все по-другому.)

Комментарии:

1. Это здорово, что diff не нужно никакой другой упаковки.

Ответ №2:

Попробуйте использовать dplyr::lag ,

 bitcoin$PercentageCh lt;- round((bitcoin$AverageP-lag(bitcoin$AverageP))/lag(bitcoin$AverageP)*100, 3)  

Я ошибся с расположением lag

Разница между dlpyr::lag и stats::lag

 bitcoin lt;- data.frame(  AverageP = rnorm(10) ) bitcoin$PercentageCh lt;- round((bitcoin$AverageP-dplyr::lag(bitcoin$AverageP))/dlpyr::lag(bitcoin$AverageP)*100, 3) bitcoin   AverageP PercentageCh 1 2.1972088 NA 2 1.4049739 -36.056 3 0.5074163 -63.884 4 -1.4304888 -381.916 5 0.1726630 -112.070 6 -0.9722128 -663.070 7 -0.1076338 -88.929 8 1.1585936 -1176.421 9 -0.2636449 -122.756 10 -1.5825011 500.240   bitcoin$PercentageCh lt;- round((bitcoin$AverageP-stats::lag(bitcoin$AverageP))/stats::lag(bitcoin$AverageP)*100, 3)  bitcoin   AverageP PercentageCh 1 2.1972088 0 2 1.4049739 0 3 0.5074163 0 4 -1.4304888 0 5 0.1726630 0 6 -0.9722128 0 7 -0.1076338 0 8 1.1585936 0 9 -0.2636449 0 10 -1.5825011 0  

Комментарии:

1. У меня 0 в каждой строке PercentageCh

2. Вероятно, потому, что вы не загрузились dplyr ; измените lag на dplyr::lag , если он у вас установлен.

3. @a_mukhamedshin Возможно, вам потребуется установить и загрузить dplyr пакет. Я добавляю разницу между stats::lag и dplyr::lag .

Ответ №3:

С образцами данных:

 bitcoin lt;- data.frame(AverageP = c(431.8805, 433.9660, 429.2245, 431.8005))  

Использование пользовательской функции:

 pct_change lt;- function(x){  round((x - dplyr::lag(x))/dplyr::lag(x)*100,3) }   bitcoin$PercentageCh lt;- pct_change(bitcoin$AverageP)  

Дает нам:

 AverageP PercentageCh 1 431.8805 NA 2 433.9660 0.483 3 429.2245 -1.093 4 431.8005 0.600  

Комментарии:

1. Спасибо, что отметил это. Я уточнил dplyr::lag