首先,让我们生成一些示例数据并安装plyr
和data.table
包:
library("plyr", lib.loc="~/R/win-library/3.1")
library("data.table", lib.loc="~/R/win-library/3.1")
x<-seq(1:12)
y<-rep(seq(1:4),3)
z<-c(rep("a",6),rep("b",6))
t<-rep(seq(2005,length.out=6),2)
df<-data.table(t,x,y,z)
setkey(df,z,t)
这将产生一个表:
t x y z
1: 2005 1 1 a
2: 2006 2 2 a
3: 2007 3 3 a
4: 2008 4 4 a
5: 2009 5 1 a
6: 2010 6 2 a
7: 2005 7 3 b
8: 2006 8 4 b
9: 2007 9 1 b
10: 2008 10 2 b
11: 2009 11 3 b
12: 2010 12 4 b
现在的工作是:根据z将此data.frame分成两个小数据集。在每一组中,如果y > lag(y,k=1)
(即y>先前的y)。然后应用函数i=y/lag(y,k=1)
,否则,应用函数i=-y/lag(y,k=1)
。
我尝试的方法如下:
#####define a function f
f<-function(x,y)
{ if (y>lag(y,k=1)) {i<-y/lag(y,k=1)}
else{i<--y/lag(y,k=1)}
return (i)
}
#######using ddply to apply function to subset
v<-ddply(df,.(z),summarize,i=f(x,y))
然而,这将返回错误按摩说:
Error in attributes(column) <- a :
invalid time series parameters specified
In addition: Warning messages:
1: In if (y > lag(y, k = 1)) { :
the condition has length > 1 and only the first element will be used
2: In if (y > lag(y, k = 1)) { :
the condition has length > 1 and only the first element will be used
我认为我在编码过程中犯了一些错误,更重要的是,似乎我的if语句没有在函数中循环。任何人都知道如何纠正这个问题??
非常感谢您的帮助!
更新
期望的结果是这样的:
t x y z i
1: 2005 1 1 a na
2: 2006 2 2 a 2.000000
3: 2007 3 3 a 1.500000
4: 2008 4 4 a 1.333333
5: 2009 5 1 a -0.250000
6: 2010 6 2 a 2.000000
1: 2005 7 3 b na
2: 2006 8 4 b 1.333333
3: 2007 9 1 b -0.250000
4: 2008 10 2 b 2.000000
5: 2009 11 3 b 1.500000
6: 2010 12 4 b 1.333333
再次感谢!