我有一个名为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]
...我不确定我是否清楚地解释了这一点。我非常感谢你的帮助。
答案 0 :(得分:1)
R为exp
,cos
,sqrt
以及所有算术运算符进行矢量化,因此您真正需要做的就是循环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
是由于在此示例中NaN
和t
的第一个值为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)