使用zoo或更好的包从R中的数据框中减去两个因子的行

时间:2016-05-08 20:09:32

标签: r wrds-compusat wrds

我有一个由公司(“gvkey”)和日历季度(“datafqtr”)和其他变量(例如“day”)订购的data.frame

output

在R中执行以下操作的最佳方法是什么? (不一定使用动物园?)

对于这个数据框架,对于每个公司和每年,从第四季度减去第三季度,然后从第一季度减去第二季度,最后从第二季度减去第一季度。

输出应如下所示:

gvkey datafqtr  dvy
1  1001   1983Q1 0.50
2  1001   1983Q2 1.50
3  1001   1983Q3 2.00
4  1001   1983Q4 4.50
5  1002   1984Q1 0.00
6  1002   1984Q2 0.00
7  1002   1984Q3 0.10
8  1002   1984Q4 0.45

我曾想过以下方式:

使用zoo包并将每个变量滞后一次,同时将公司代码(“gvkey”)和calendar quarter(datafqtr)作为因子,然后减去观察值。

gvkey datafqtr  dvy
1  1001   1983Q1 0.50
2  1001   1983Q2 1.00
3  1001   1983Q3 0.50
4  1001   1983Q4 2.50
5  1002   1984Q1 0.00
6  1002   1984Q2 0.00
7  1002   1984Q3 0.10
8  1002   1984Q4 0.35

然后我将动物园转换为常规data.frame并从非滞后变量中减去滞后变量:

data<-zoo(data)

data<-data[order(data[,'gvkey'],data[,'datafqtr']),]

data$lagfqtr<-lag(data$datafqtr,-1,na.pad=TRUE)
data$laggvkey<-lag(data$gvkey,-1,na.pad=TRUE)

data$lagdvy<-lag(data$dvy,-1,na.pad=TRUE)

我不确定这是否正在做我想做的事,

谢谢你,感谢你的帮助,

3 个答案:

答案 0 :(得分:1)

同样,您可以在data.table中完成您想要做的事情,如下所示。顺便说一下,我认为你不需要转移前两列。

library(data.table)
setDT(data)[order(gvkey, datafqtr)][,dvy1 := Reduce("-", shift(dvy, n = 0:1, type = "lag", fill = 0)), .(gvkey)]
data
   gvkey datafqtr  dvy dvy1
1:  1001   1983Q1 0.50 0.50
2:  1001   1983Q2 1.50 1.00
3:  1001   1983Q3 2.00 0.50
4:  1001   1983Q4 4.50 2.50
5:  1002   1984Q1 0.00 0.00
6:  1002   1984Q2 0.00 0.00
7:  1002   1984Q3 0.10 0.10
8:  1002   1984Q4 0.45 0.35

答案 1 :(得分:1)

假设data是最后注释中的数据框,请尝试:

transform(data, dvy = ave(dvy, gvkey, floor(datafqtr), FUN = function(x) c(x[1], diff(x))))

,并提供:

  gvkey datafqtr  dvy
1  1001  1983 Q1 0.50
2  1001  1983 Q2 1.00
3  1001  1983 Q3 0.50
4  1001  1983 Q4 2.50
5  1002  1984 Q1 0.00
6  1002  1984 Q2 0.00
7  1002  1984 Q3 0.10
8  1002  1984 Q4 0.35

注意:为了重现性,使用的输入数据框是这样的(其中datafqtr列是动物园包类"yearqtr"):

data <- structure(list(gvkey = c(1001, 1001, 1001, 1001, 1002, 1002, 
  1002, 1002), datafqtr = structure(c(1983, 1983.25, 1983.5, 1983.75, 
  1984, 1984.25, 1984.5, 1984.75), class = "yearqtr"), dvy = c(0.5, 
  1.5, 2, 4.5, 0, 0, 0.1, 0.45)), .Names = c("gvkey", "datafqtr", 
  "dvy"), row.names = c(NA, -8L), class = "data.frame")

答案 2 :(得分:-1)

使用库dplyr,您可以执行以下操作(从当前值中减去滞后值):

library(dplyr)
df %>%
  group_by(gvkey) %>%
  mutate(dvy = dvy - lag(dvy, default = 0))

输出如下所示:

Source: local data frame [8 x 3]
Groups: gvkey [2]

  gvkey datafqtr   dvy
  <int>    <chr> <dbl>
1  1001   1983Q1  0.50
2  1001   1983Q2  1.00
3  1001   1983Q3  0.50
4  1001   1983Q4  2.50
5  1002   1984Q1  0.00
6  1002   1984Q2  0.00
7  1002   1984Q3  0.10
8  1002   1984Q4  0.35

注意:如果已经订购了数据,这将有效。否则,您只需要将arrange函数引入上面的管道中,一切都应该落实到位。