2014-02-05 5 views
-1

Ниже приведен образец данных, который у меня есть.Запуск статистики в R

Year - Revenue 
    2001 1.23 
    2002 23.4 
    2003 12.4 
    2004 18.0 
    ... 

Я ищу, чтобы рассчитать текущую статистику - например, рост YoY. Это будет доход [2002] - доход [2001].

Я могу сделать это с помощью петель. Но есть ли базовая функция или что-нибудь в plyr, чтобы выполнить это более элегантно?

+6

Посмотрите на '? Diff' –

ответ

2

Как предложено diff сделает то, что вы ищете. Если ваш набор данных большой или есть группы, вы можете попробовать dplyr.

require(dplyr) 

dat <- read.table(header = TRUE, text = "Year Revenue 
2001 1.23 
2002 23.4 
2003 12.4 
2004 18.0") 

mutate(dat, yoy = Revenue - lag(Revenue)) 

    Year Revenue yoy 
1 2001 1.23  NA 
2 2002 23.40 22.17 
3 2003 12.40 -11.00 
4 2004 18.00 5.60 

Редактировать: В ответ на комментарий Эди. Также, как представляется, некоторые различия в том, как данные копируются. См. Вывод от dplyr's changes ниже.

> dplyr_dat <- mutate(dat, yoy = Revenue - lag(Revenue)) 
> dplyr::changes(dat, dplyr_dat) 
Changed variables: 
      old new   
yoy   0x10d951400 

Changed attributes: 
      old   new   
names  0x10c3161b8 0x10deeb128 
class  0x101ca6568 0x103668108 
row.names 0x10c233f88 0x100c98a68 
> diff_dat <- within(dat, yoy <- c(NA, diff(Revenue))) 
> dplyr::changes(dat, diff_dat) 
Changed variables: 
      old   new   
Year  0x10c316180 0x11086b9f0 
Revenue 0x1036b2120 0x1070c0f28 
yoy     0x110118a40 

Changed attributes: 
      old   new   
names  0x10c3161b8 0x10c310ff8 
class  0x101ca6568 0x10f4ce7a8 
row.names 0x10c1d6a38 0x10f7dca78 
+1

Будет ли' mutate' выполнять быстрее, чем 'diff' на больших наборах данных? FYI @ user3273226, подход 'diff' может выглядеть следующим образом:' in (dat, yoy <- c (NA, diff (Revenue))). – jbaums

+1

@ jbaums - микрофотометр «diff» vs. «mutate» предлагает время улучшения 30 мс против 15 мс для вектора длины 400 К, 178 мс против 69 мс для вектора длины 2М. Не разрушающие землю различия для повседневной работы, но немного быстрее. – thelatemail

+0

@thelatemail спасибо за запуск теста. Я положу 'mutate' в свой список вещей, чтобы помнить. – jbaums

Смежные вопросы