Процентное изменение значений в г - PullRequest
1 голос
/ 12 апреля 2020

Вот df, который я использую:

              Date Country      City Specie count min max median variance
27  2020-03-25      IN     Delhi   pm25   797   6 192     92 12116.60
159 2020-03-25      IN   Chennai   pm25    96  27  89     57  1928.38
223 2020-03-25      IN    Mumbai   pm25   285  12 163     90  6275.41
412 2020-03-25      IN Bengaluru   pm25   179  25 145     73  4890.82
419 2020-03-25      IN   Kolkata   pm25   260   6 168    129 10637.10
10  2020-04-10      IN     Delhi   pm25   835   2 393    137 24542.30
132 2020-04-10      IN   Chennai   pm25    87   5 642     53 87856.50
298 2020-04-10      IN    Mumbai   pm25   168   1 125     90  5025.35
358 2020-04-10      IN Bengaluru   pm25   159  21 834     56 57091.10
444 2020-04-10      IN   Kolkata   pm25   219   4 109     64  2176.61

Я хочу рассчитать процентное изменение между «медианными» значениями фрейма данных. Для этого я использовал следующий код:

    pct_change_pm25 <- day %>%
  arrange(City, .by_group = TRUE) %>%
  mutate(pct_change = -diff(median) / median[-1] * 100)

Но я получаю эту ошибку:

Error in arrange_impl(.data, dots) : 
  incorrect size (1) at position 2, expecting : 10

Количество строк, создаваемых mutate, равно 9 и не совпадает с количество строк в df. Я следовал за этим постом на stackoverflow: Рассчитать процентное изменение в R, используя dplyr

Но, к сожалению, id не работал для меня.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Поскольку diff возвращает вектор длины на 1 меньше исходного вектора, добавьте NA в начале вычисления. Также, вероятно, вы хотите сделать это для каждого City в отдельности, следовательно, сгруппировать по городам.

library(dplyr)

df %>%
  arrange(City) %>%
  group_by(City) %>%
  mutate(pct_change = c(NA, -diff(median) / median[-1] * 100))

Другой способ сделать то же самое вычисление - использовать lag

df %>%
  arrange(City) %>%
  group_by(City) %>%
  mutate(pct_change = (lag(median) - median)/median * 100)


#  Date       Country City      Specie count   min   max median variance pct_change
#   <fct>      <fct>   <fct>     <fct>  <int> <int> <int>  <int>    <dbl>      <dbl>
# 1 2020-03-25 IN      Bengaluru pm25     179    25   145     73    4891.      NA   
# 2 2020-04-10 IN      Bengaluru pm25     159    21   834     56   57091.      30.4 
# 3 2020-03-25 IN      Chennai   pm25      96    27    89     57    1928.      NA   
# 4 2020-04-10 IN      Chennai   pm25      87     5   642     53   87856.       7.55
# 5 2020-03-25 IN      Delhi     pm25     797     6   192     92   12117.      NA   
# 6 2020-04-10 IN      Delhi     pm25     835     2   393    137   24542.     -32.8 
# 7 2020-03-25 IN      Kolkata   pm25     260     6   168    129   10637.      NA   
# 8 2020-04-10 IN      Kolkata   pm25     219     4   109     64    2177.     102.  
# 9 2020-03-25 IN      Mumbai    pm25     285    12   163     90    6275.      NA   
#10 2020-04-10 IN      Mumbai    pm25     168     1   125     90    5025.       0   
0 голосов
/ 12 апреля 2020

С data.table мы можем сделать

library(data.table)
setDT(df)[, pct_change := (shift(median) - median)/median * 100, City]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...