dplyr, purr, динамически генерировать / вычислять новые столбцы в R - PullRequest
0 голосов
/ 30 января 2019

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

Редактировать:

Минимальный пример может выглядеть так:

## Minimal example

library(tidyverse)

## Given data frame

df <- tibble(
        City = c("Melbourne", "Sydney", "Adelaide"),
        year_2000 = c(100, 100, 205),
        year_2001 = c(101, 100, 207),
        year_2002 = c(102, 100, 209)
        )

## Result

df <- df %>%
  mutate(
    gr_2000_2001 = year_2001/year_2000*100 - 100,
    gr_2001_2002 = year_2002/year_2001*100 - 100
  )

Я хочу найти способ автоматизировать / сделать команду mutate умным способом, как я должен делать это в течение 150 лет.

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

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

1 Ответ

0 голосов
/ 30 января 2019

Самым простым способом в этом примере, вероятно, было бы привести в порядок ваши данные, а затем применить любую формулу, которую вы используете для расчета темпов роста, с помощью функции dplyr lag() к фрейму данных, сгруппированному по City:

## Minimal example
library(tidyverse)
df <- data.frame(City = c("Melbourne", "Sydney"),
             year_2000 = c(100, 100),
             year_2001 = c(101,100),
             year_2002 = c(102, 102))

df %>%
  gather(year, value, 2:4) %>%
  group_by(City) %>%
  mutate(growth = value/dplyr::lag(value,n=1))

Результат таков:

# A tibble: 6 x 4
# Groups:   City [2]
  City      year      value growth
  <fct>     <chr>     <dbl>  <dbl>
1 Melbourne year_2000   100  NA   
2 Sydney    year_2000   100  NA   
3 Melbourne year_2001   101   1.01
4 Sydney    year_2001   100   1   
5 Melbourne year_2002   102   1.01
6 Sydney    year_2002   102   1.02

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...