#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