如何在ddply或任何类型的apply()中应用if语句的函数?

时间:2015-01-27 18:47:09

标签: r if-statement plyr

首先,让我们生成一些示例数据并安装plyrdata.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

再次感谢!

0 个答案:

没有答案