1

我有一个向量test <- c(1:90)(在每日时间步长中大约代表 3 个月),我想在模型运行期间仅在每个月的第 10 天到第 20 天之间为变量赋值

//model code

if(month-day>10 && month-day<20)
{
    parameter <- 10
} else {
    parameter <- 5
}

通过找到模数test%%30

> test%%30
[1] 1 2 3 4 [...] 27 28 29 0 1 2 3 ...

我刚刚遇到了如何获得我想要的值的难题(即在这个简单的例子中,我想要test[11:19],test[41:49]test[71:79],但是必须有一种方法可以使用一些我无法想到的聪明的数学运算符来获取这些值片刻...

4

3 回答 3

1

要转换为 1:30 的块,请使用:

(test-1)%%30+1

如果您想获得 10:19 的数字(从 10 开始的 10 块),您可以使用:

test[(((test-1)%%30+1)%/%10)==1]

但是,当您想要从 11 开始的 9 块时,您需要多考虑模数后的移位:

test[(((test-1)%%30-1)%/%9)==1]
 [1] 11 12 13 14 15 16 17 18 19 41 42 43 44 45 46 47 48 49 71 72 73 74 75 76 77
[26] 78 79
于 2012-04-17T15:05:07.167 回答
0
x <- 1:90
param <- rep(5, length(x))
param[x%%30 > 10 & x%%30 < 20] <- 10
#Double check output 
cbind(x, param)
于 2012-04-17T14:42:37.130 回答
0

为了扩展joran的答案,这就是我要做的:

test <- c(1:90)
days <- test%%30
positions <- test[days %in% 10:20]

这将返回一个向量,其中test每天的位置在 10 到 20 之间。

不过,不完全确定你为什么需要这个职位;你的代码不能只使用:

for(x in 1:90) {
    if(days[x]>=10 && days[x]<=20) {
        parameter <-  10
    } else {
        parameter <- 5
    }
}

或者我在这里错过了什么?

编辑添加:哎呀,我应该注意到在这种情况下,参数可能更好地用作向量 - 我只是没有这样编写代码。

于 2012-04-17T14:50:28.873 回答