Рассчитать изменение во времени с помощью аккуратных данных в R - нужно ли их распространять и собирать? - PullRequest
1 голос
/ 20 июня 2019

Быстрый вопрос о расчете изменения во времени для аккуратных данных. Нужно ли распространять данные, видоизменять переменную и затем снова собирать данные (см. Ниже), или есть более быстрый способ сделать это, сохраняя данные аккуратными.

Вот пример:

df <- data.frame(country = c(1, 1, 2, 2), 
                 year = c(1999, 2000, 1999, 2000), 
                 value = c(20, 30, 40, 50))
df
  country year value
1       1 1999    20
2       1 2000    30
3       2 1999    40
4       2 2000    50

Чтобы рассчитать изменение стоимости между 1999 и 2000 годом, я бы:

library(dplyr)
library(tidyr)
df2 <- df %>% 
  spread(year, value) %>% 
  mutate(change.99.00 = `2000` - `1999`) %>% 
  gather(year, value, c(`1999`, `2000`))

df2
  country change.99.00 year value
1       1           10 1999    20
2       2           10 1999    40
3       1           10 2000    30
4       2           10 2000    50

Это кажется трудоемким способом сделать это. Я предполагаю, что должен быть аккуратный способ сделать это, сохраняя данные в узком, аккуратном формате, сгруппировав данные или что-то еще, но я не могу об этом думать и не могу найти ответ в Интернете.

Есть ли более простой способ сделать это?

1 Ответ

3 голосов
/ 20 июня 2019

После группировки по 'стране', отфильтруйте diff 'значения' с логическим выражением year %in% 1999:2000

library(dplyr)
df %>% 
   group_by(country) %>%
   mutate(change.99.00 = diff(value[year %in% 1999:2000]))
# A tibble: 4 x 4
# Groups:   country [2]
#  country  year value change.99.00
#    <dbl> <dbl> <dbl>        <dbl>
#1       1  1999    20           10
#2       1  2000    30           10
#3       2  1999    40           10
#4       2  2000    50           10

ПРИМЕЧАНИЕ. Здесь мы предполагаем, что «год» не дублируется для «страны»

...