我有一个由公司(“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)
我不确定这是否正在做我想做的事,
谢谢你,感谢你的帮助,
答案 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
函数引入上面的管道中,一切都应该落实到位。