在模数运算后选择特定值

时间:2012-04-17 14:25:12

标签: r mathematical-expressions

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

//model code

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

通过找到模数(test%%30),我可以得到一个包含每个月天数的向量,但需要从后续向量中获取每个月10-20天的位置

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

我刚刚尝试了如何获取我想要的值(即在这个简单的示例中我想要test[11:19]test[41:49]test[71:79],但必须有一种方法使用我目前无法想到的一些聪明的数学运算符来获取这些值...

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

x <- 1:90
param <- rep(5, length(x))
param[x%%30 > 10 & x%%30 < 20] <- 10
#Double check output 
cbind(x, param)

答案 2 :(得分: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
    }
}

或者我在这里遗漏了什么?

编辑添加:哎呀,我应该注意到在这种情况下,参数可能更适合用作矢量 - 我只是没有按照这种方式编写代码。