【问题标题】:Selecting specific values following a modulus operation在模运算之后选择特定值
【发布时间】:2012-04-17 23:05:07
【问题描述】:

我有一个向量 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],但必须有一种方法可以使用一些方法来获取这些值我暂时想不到的聪明的数学运算符...

【问题讨论】:

  • 为什么是10:2041:4971:79
  • 道歉 - 这是一个错字!消除歧义
  • ...所以你没有 28,29 或 31 天的月份吗?

标签: r mathematical-expressions


【解决方案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

【讨论】:

    【解决方案2】:
    x <- 1:90
    param <- rep(5, length(x))
    param[x%%30 > 10 & x%%30 < 20] <- 10
    #Double check output 
    cbind(x, param)
    

    【讨论】:

      【解决方案3】:

      为了扩展 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
          }
      }
      

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

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

      【讨论】:

      • 我想要每个月的中间10天。嗯..也许我的问题没有遇到这种情况
      • 您是否每个月使用不同的天数,例如2 月 28 日,3 月 31 日,等等?
      • 不 - 这是一个比这更简单的表示
      • 因此,如果 test 是研究的总天数(或其他),那么 days 就是分解为 30 个单位块的向量。因此,选择 10 到 20 之间的值应该是每个月的中间 10 天。
      猜你喜欢
      • 2020-05-10
      • 2018-07-28
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多