对于R中的循环问题

时间:2013-08-09 21:09:39

标签: r for-loop

我有一个名为dv(日值)的365x1向量。我正在应用一个函数来生成一些小时值,hv。我的代码如下:

sigma<-0.246*dv
stime<-function(x,y,z){(exp(-(x-12)^2/(2*y^2))+cos(pi*(x-12)/(z-1)))/(2*y*sqrt(2*pi))}
t<-1:24
hv<-NULL
for (i in seq(along=t)){hv<-c(hv,mapply(stime,t[i],sigma,dv))}

我想使用t[1],t[2],...t[24]z=dv[1]使用z=dv[2]前24个值,然后使用dv[1],dv[2]...dv[365]等24个值。但这段代码的作用是拥有前365个值{{1接下来t[1]然后接下来的365个值t[2] ...我不确定我是否清楚地解释了这一点。我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

R为expcossqrt以及所有算术运算符进行矢量化,因此您真正需要做的就是循环dv值。

以下是使用sapply函数的示例,为简洁起见,只使用前3个t值...

dv <- 1:5
sapply( dv , function(i) stime( x = t[1:3] , y = 0.246*i , z = i ) )

     [,1]       [,2]          [,3]       [,4]          [,5]
[1,]  NaN -0.4054291 -6.621773e-16  0.1013573 -1.146727e-01
[2,]  NaN  0.4054291 -2.702861e-01 -0.1013573  7.689812e-16
[3,]  NaN -0.4054291  1.489523e-16 -0.2027146  1.146727e-01

因此z有一个值(当前为dv值),y有一个值为0.246 *当前dv值,而3 t的{​​{1}}值。输出为3个值,每个x一个,sigma和t值每次都被回收并重复使用。

第一列中的dv是由于在此示例中NaNt的第一个值为1,这导致

dv

简化为;

cos(pi * (1 - 12)/(1 - 1))

因此,在此示例中结果必须为cos(-Inf) NaN (希望在您的实际数据中不是这种情况)。

答案 1 :(得分:1)

也许:

hv <- stime( x =rep(dv, each= 24), y=rep(1:24, each=365), z=x)