Я пытаюсь провести расчеты со строками в столбце: у меня есть следующие данные для одного продукта:

Day    Price
1      3$
2      12$
3      4$
4      2$
5      4$

Я хочу разделить изменение цены за день на предыдущий день, например, для дня 2:

12$/3$ = 4 

Результаты должны быть:

Day    Price    Calculation
1      3$       NA
2      12$      4
3      4$       0,33
4      2$       0,5
5      4$       2

У меня есть список из 5000 цен. Меня также беспокоит, как получить NA в День 1, если расчет невозможен.

Спасибо!

2
upflow 9 Окт 2021 в 21:22

2 ответа

Лучший ответ

Мы можем разделить текущее значение на предыдущее значение (lag). $ не рассматривается в классе numeric. Нам может потребоваться извлечь значение numeric (parse_number) делает это и произвести расчет

library(dplyr)
df1 <- df1 %>%
    mutate(Calculation = readr::parse_number(as.character(Price)),
        Calculation = round(Calculation/lag(Calculation), 2))

-вывод

df1
 Day Price Calculation
1   1    3$          NA
2   2   12$        4.00
3   3    4$        0.33
4   4    2$        0.50
5   5    4$        2.00

Данные

df1 <- structure(list(Day = 1:5, Price = c("3$", "12$", "4$", "2$", 
"4$")), class = "data.frame", row.names = c(NA, -5L))
1
akrun 9 Окт 2021 в 18:44

Вот единственное решение dplyr, использующее gsub вместо parse_number:

library(dplyr)
df %>% 
  mutate(Calculation=as.numeric(gsub("\\$", "", Price)),
         Calculation=round(Calculation/lag(Calculation), 2))
Day Price Calculation
1   1    3$          NA
2   2   12$        4.00
3   3    4$        0.33
4   4    2$        0.50
5   5    4$        2.00
0
TarJae 9 Окт 2021 в 19:28