根据除法的结果将矢量除以不同的值

时间:2017-05-17 09:25:26

标签: r

我有这样的Df:

          x         y          z
  <dbl>     <dbl>      <dbl>
1  408001.9       343          0
2  407919.2       343          0
3  407839.6       343          0
4  407761.2       343          0
5  407681.7       343          0
6  407599.0       343          0
7  407511.0       343          0
8  407420.5       343          0
9  407331.0       343          0
10 407242.0       343          0
11 407152.7       343          0
12 407062.5       343          0
13 406970.7       343          0
14 406876.6       342          0
15 406777.1       342          0
16 406671.0       342          0
17 406560.9       342          0
18 406449.4       342          0
19 406339.0       342          0
20 406232.5       342          0
...  ...          ...         ...

随着x的减少。

这样的矢量
vec=(a1, a2, a3, a4, a5, a6, ...)

a1&lt; A2&LT; A3&LT; A4 ...

现在我想将df$x除以vec[1],这将得到与df$y相同的结果(舍入)。

但是现在,当df$z中的值下降1到342时,我希望将df$x中的值除以vec[2],然后再获取新{{1}值。

从此处结果与df$z不同,对于df$y,要分割的数字是全部df$y并且不会更改

每次vec[1]得到的值下降1时,df$z的下一个值都应使用相应的df$z计算,其中i是滴数+ 1到目前为止

最后,我想要一个向量vec[i],其中值为df$z,其中df$x / vec[i]取决于vec [i]的最后一个数字。

可重复的例子:

df$z

这将为你提供一个带有一个col的df,用于vec的每个值,测试$ x除以。 现在,最后,我的向量应包含col2的值,直到col2中的值从60降到59.之后我想要col3中的值,直到col3中的值降到59到58以下。然后我想要col4中的值等等。

我怎么能用任何数据来实现这一点(比如我的上面,这个例子并不是线性的。)

我尝试了一些for和while循环,但没有一个工作。我甚至没有接近我想要的东西。

我认为我的问题是我不知道如何使条件依赖于值(在点i处的test <- data.frame(x = sort((seq(500, 600, 2)), decreasing = T) ) vec <- seq(10, 10.9, 0.03) for(i in 1:31){ test[i+1] <- round(test$x/vec[i]) } 的值),我想在同一操作中计算。我想计算df$z的值,其值为df$z[i],目前已使用过。vec[t]但是如果df$z的值在某个观察值[i]下降1,则vec[t+1]的值将从那时起用于除法。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我希望我明白你在问什么。这可能就是......

test <- data.frame(x = sort((seq(500, 600, 2)), decreasing = T)
vec <- seq(10, 10.9, 0.03)

#this function determines the index of `vec` to use
xcol<-function(v){
  x<-rep(NA,length(v))
  x[1] <- 1
  for(i in 2:length(v)){
    x[i] <- x[i-1]
    if(round(v[i]/vec[x[i]])<round(v[i-1]/vec[x[i]])){
      x[i] <- x[i]+1
    }
  }
  return(x)
}

test$xcol <- xcol(test$x)
test$z <- round(test$x/vec[test$xcol])

 test
     x xcol  z
1  600    1 60
2  598    1 60
3  596    1 60
4  594    2 59
5  592    2 59
6  590    2 59
7  588    2 59
8  586    3 58
9  584    3 58
10 582    3 58
11 580    3 58
12 578    4 57
...