【问题标题】:New vector based on comparing elements of two other vectors "lagged"?基于比较“滞后”的其他两个向量的元素的新向量?
【发布时间】:2010-11-26 13:59:18
【问题描述】:

我有两个向量,subjecttarget。我想根据两个现有向量之间的比较创建一个新向量,并比较元素lagged。我已经使用下面的循环解决了这个问题,但我基本上想知道使用apply 是否有更优雅的解决方案?

subject <- c(200, 195, 190, 185, 185, 185, 188, 189, 195, 200, 210, 210)
target <- c(subject[1], subject[1]-cumsum(rep(perweek, length(subject)-1)))
adjtarget <- target                                               

for (i in 1:(length(subject)-1)) {
  if (subject[i] > adjtarget[i]) {                
    adjtarget[i+1] <- adjtarget[i]           
   } else {                                       
    adjtarget[i+1] <- adjtarget[i]-perweek  }
   }
 }

【问题讨论】:

  • 每周变量的值是多少?
  • 您好,抱歉忘记了这一点:每周只是任何整数。就我而言,它是每周
  • 代码有点难理解。在循环中,分配在您将在下一次迭代中比较的位置更改adjtarget。恐怕没有优雅的解决方案可以在 R 中表达这一点,您通常在其中并行处理整个向量。比较是一个移动的目标

标签: r


【解决方案1】:

这并不能完全解决您的问题,但可能指向一个有用的方向。我忽略了更改adjtarget 并与之比较之间的相互作用,并显示了一个类似的问题,我们将其与常量target 进行比较。然后可以将循环中的if改为向量比较:

lv <- but.last(subject) > but.last(target)
ind <- which(lv)

准备结果向量(我将其称为x,因为它与您的adjtarget 的结果不同)作为target 的移动副本并将更改分配给它:

x <- c(target[1], but.last(target))  # corresponds to the true branch of the `if`
x[ind+1] <- target[ind] - perweek    # corresponds to the false branch

或者,

x <- c(target[1], but.last(target) - (!lv)*perweek

正如我所说,这并不能解决您的问题,但也许我们可以从这里开始。

【讨论】:

    【解决方案2】:

    为了澄清,如果我理解你的代码,这就是你正在寻找的结果......

    > (goal <- cbind(subject,target,adjtarget))
    
          subject target adjtarget
     [1,]     200    200       200
     [2,]     195    198       198
     [3,]     190    196       196
     [4,]     185    194       194
     [5,]     185    192       192
     [6,]     185    190       190
     [7,]     188    188       188
     [8,]     189    186       186
     [9,]     195    184       186
    [10,]     200    182       186
    [11,]     210    180       186
    [12,]     210    178       186
    

    如果我是对的,那么向量化的挑战就是在 adjtarget 中重复分配 186。矢量化代码将评估右侧(RHS),然后将其分配给左侧(LHS)。因此,在赋值完成之前,向量化代码不会在第 9 行的 adjtarget 中看到更新的值。

    > y <- ifelse(subject > target, 1, 0) # matches TRUE case
    > x <- target
    > x[ind+1] <- target[ind]
    > cbind(goal, x, y)
          subject target adjtarget   x y
     [1,]     200    200       200 200 0
     [2,]     195    198       198 198 0
     [3,]     190    196       196 196 0
     [4,]     185    194       194 194 0
     [5,]     185    192       192 192 0
     [6,]     185    190       190 190 0
     [7,]     188    188       188 188 0
     [8,]     189    186       186 186 1
     [9,]     195    184       186 186 1 # assigned correctly (?)
    [10,]     200    182       186 184 1 # incorrect x; should be 186
    [11,]     210    180       186 182 1 # incorrect x; should be 186
    [12,]     210    178       186 180 1 # incorrect x; should be 186
    

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 2018-04-19
      • 2023-03-09
      • 2020-06-15
      • 1970-01-01
      相关资源
      最近更新 更多