我正在尝试计算由gvkey
(1001,1384等等)认可的公司的季度数据的价格变化百分比。它是相应的季度股票价格PRCCQ
。
gvkey PRCCQ
1 1004 23.750
2 1004 13.875
3 1004 11.250
4 1004 10.375
5 1004 13.600
6 1004 14.000
7 1004 17.060
8 1004 8.150
9 1004 7.400
10 1004 11.440
11 1004 6.200
12 1004 5.500
13 1004 4.450
14 1004 4.500
15 1004 8.010
我要做的是添加8列,显示1季度回报,2季度回报等,一直到8个季度。我已经能够使用delt
的{{1}}和quantmod
的{{1}}函数计算每个PRCCQ的1季度回报率,我也能够得到第2季度通过更改ddply
返回使用相同的代码。
plyr
然而,这个等式不允许我高于k
,而不会给出<2,3>行数2,3 的错误。我现在尝试使用许多替代方法,但是工作。是否有一个函数我可以插入ddply(data, "gvkey", transform, DeltaCol = Delt(PRCCQ,k=2))
代码我必须替换k=2
或者可能是另一个完全替代的代码行来显示各个列中的所有8个季度的返回值?
答案 0 :(得分:1)
您可以将数据声明为ts()
并使用cbind()
和diff()
data <- read.table(header=T,text='gvkey PRCCQ
1004 23.750
1004 13.875
1004 11.250
1004 10.375
1004 13.600
1004 14.000
1004 17.060
1005 8.150
1005 7.400
1005 11.440
1005 6.200
1005 5.500
1005 4.450
1005 4.500
1005 8.010')
data <- split(data,list(data$gvkey))
(newdata <- do.call(rbind,lapply(data,function(data) { data <- ts(data) ; cbind(data,Quarter=diff(data[,2]),Two.Quarter=diff(data[,2],2))})))
data.gvkey data.PRCCQ Quarter Two.Quarter
[1,] 1004 23.750 NA NA
[2,] 1004 13.875 -9.875 NA
[3,] 1004 11.250 -2.625 -12.500
[4,] 1004 10.375 -0.875 -3.500
[5,] 1004 13.600 3.225 2.350
[6,] 1004 14.000 0.400 3.625
[7,] 1004 17.060 3.060 3.460
[8,] 1005 8.150 NA NA
[9,] 1005 7.400 -0.750 NA
[10,] 1005 11.440 4.040 3.290
[11,] 1005 6.200 -5.240 -1.200
[12,] 1005 5.500 -0.700 -5.940
[13,] 1005 4.450 -1.050 -1.750
[14,] 1005 4.500 0.050 -1.000
[15,] 1005 8.010 3.510 3.560
编辑:
另一种方式,没有split()
和lapply()
(可能更快)
data <- read.table(header=T,text='gvkey PRCCQ
1004 23.750
1004 13.875
1004 11.250
1004 10.375
1004 13.600
1004 14.000
1004 17.060
1005 8.150
1005 7.400
1005 11.440
1005 6.200
1005 5.500
1005 4.450
1005 4.500
1005 8.010')
newdata <- do.call(rbind,by(data, data$gvkey,function(data) { data <- ts(data) ; cbind(data,Quarter=diff(data[,2]),Two.Quarter=diff(data[,2],2))}))
答案 1 :(得分:0)
df <- read.table(text="gvkey PRCCQ
1 1004 5.500
2 1004 4.450
3 1004 4.500
4 1004 8.010
5 1005 4.450
6 1005 4.500",header=TRUE)
library(plyr)
library(quantmod)
ddply(df, "gvkey", transform, DeltaCol = Delt(PRCCQ,k=3))
#error
Delt2 <- function(x,k) {
if(length(x)>k) as.vector(Delt(x1=x,k=k)) else rep(NA,length(x))
}
ddply(df, "gvkey", transform, DeltaCol = Delt2(PRCCQ,k=3))
# gvkey PRCCQ DeltaCol
#1 1004 5.50 NA
#2 1004 4.45 NA
#3 1004 4.50 NA
#4 1004 8.01 0.4563636
#5 1005 4.45 NA
#6 1005 4.50 NA