Как мне отличить данные панели в R

Мне интересно, есть ли какие-либо простые команды или пакеты R, которые позволят мне легко добавлять переменные в data.frames, которые являются «разницей» или изменением этих переменных с течением времени.

Если бы мои данные выглядели так:

set.seed(1)
MyData <- data.frame(Day=0:9 %% 5+1, 
                 Price=rpois(10,10),
                 Good=rep(c("apples","oranges"), each=5))
MyData

   Day Price    Good
1    1     8  apples
2    2    10  apples
3    3     7  apples
4    4    11  apples
5    5    14  apples
6    1    12 oranges
7    2    11 oranges
8    3     9 oranges
9    4    14 oranges
10   5    11 oranges

Затем после «первой разности» ценовой переменной мои данные будут выглядеть так.

   Day Price    Good P1d
1    1     8  apples  NA
2    2    10  apples   2
3    3     7  apples  -3
4    4    11  apples   4
5    5    14  apples   3
6    1    12 oranges  NA
7    2    11 oranges  -1
8    3     9 oranges  -2
9    4    14 oranges   5
10   5    11 oranges  -3

person Francis Smart    schedule 21.03.2014    source источник


Ответы (6)


сохранить

transform(MyData, P1d = ave(Price, Good, FUN = function(x) c(NA, diff(x))))

ave/gsubfn

Последнее решение можно немного сократить, используя fn$ в пакете gsubfn:

library(gsubfn)
transform(MyData, P1d = fn$ave(Price, Good, FUN = ~ c(NA, diff(x))))

дплир

library(dplyr)

MyData %>% 
  group_by(Good) %>% 
  mutate(P1d = Price - lag(Price)) %>% 
  ungroup

data.table

library(data.table)

dt <- data.table(MyData)
dt[, P1d := c(NA, diff(Price)), by = Good]

Обновлять

dplyr теперь использует %>% вместо %.% .

person G. Grothendieck    schedule 24.03.2014

Можно легко сделать это следующим образом:

library(reshape2)
library(dplyr)

MyNewData <- 
 MyData %.%
 melt(id = c("Good", "Day")) %.%
 dcast(Day ~ Good) %.%
 mutate(apples  = apples - lag(apples),
     oranges = oranges - lag(oranges)) %.%
 melt(id = "Day", variable.name = "Good", value.name = "P1d") %.%
 merge(MyData) %.%
 arrange(Good, Day)

С Уважением

person Miha Trošt    schedule 24.03.2014
comment
Спасибо за решение, хотя я не уверен, что скажу легко. Мне он кажется довольно сложным. Тем более, что Stata выполнит ту же команду (gen P1d = Price-L1.Price) после установки идентификаторов панели и временного ряда. - person Francis Smart; 24.03.2014

Это то, что я придумал. Но это не кажется эффективным по крайней мере:

MyData$P1d <- c(NA, MyData$Price[-1]-MyData$Price[-nrow(MyData)])
MyData$P1d[c(F,MyData$Good[-1]!=MyData$Good[-nrow(MyData)])] <- NA

MyData

   Day Price    Good P1d
1    1     8  apples  NA
2    2    10  apples   2
3    3     7  apples  -3
4    4    11  apples   4
5    5    14  apples   3
6    1    12 oranges  NA
7    2    11 oranges  -1
8    3     9 oranges  -2
9    4    14 oranges   5
10   5    11 oranges  -3
person Francis Smart    schedule 21.03.2014

Я придумал этот код, следуя некоторым онлайн-учебникам по dpylr: Моя цель состояла в том, чтобы добавить новый столбец, который представляет собой 5-летний темп роста R & D (переменная xrd) фирм (идентификатор GVKEY). RandD2015 — это файл необработанных данных.

Используя функцию конвейера (%>%), вы можете объединить несколько вызовов в dplyr. Надеюсь, это будет полезно (мой первый вклад в код в Stack Overflow)

library(dplyr)

RandDtest<- RandDec2015 %>% 
    group_by(GVKEY) %>%
    mutate(xrd5yr=xrd/lag(xrd,4)-1)
person csqr    schedule 19.12.2015

В моем случае мне пришлось генерировать первые отличия для панели. Чтобы иметь разный вектор одинаковой длины, я использовал diff с NA.

library(dplyr)
mydata %>%
group_by(id) %>%
mutate(price_diff = c(NA, diff(price)))%>%
ungroup()
person askesis_rea    schedule 06.05.2020

collapse::fdiff — это функция, которую вы ищете:

library(collapse)
# This means compute difference of Price lagged once, iterated once, by Good, ordered by Day
settransform(MyData, P1d = fdiff(Price, 1, 1, Good, Day))
person Sebastian    schedule 01.09.2020