在计算

时间:2017-12-10 01:18:53

标签: r

我有这个载体:

vector <- c(NA,1,rep(NA,24),1,NA,NA)
 [1] NA  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA  1 NA NA

基本上我想做的是:

在excel中,命令是这样的: 计算点= E40

=IF(B41=1,1,+E39+1)

在R中它会像:

ifelse([+1 forward] == 1,1,[-1 behind]+1)

它基本上是一个计数器,当遇到1时重置为1。

这是期望的输出:

> output
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25  1  2  3  4 

如果我们从元素1 vector[1]开始,那么我们将使用语句ifelse([+ 1 forward],1,1

查看vector[2]

在这种情况下,这是真的所以我们放置1 ...接下来我们向上移动一个元素位置。现在我们在位置2 ..矢量[2]。该声明现在正在寻找一个ifelse([+ 1 forward],1,1 in vector [3],如果它不是1,否则它将vector[1]并添加+1。接下来的事情...... at位置vector[3],该语句现在正在寻找ifelse([+ 1 forward],vector[4]中的1,1,如果它不是1,则其取向量[2]并添加+1 ..所以一个正在运行的计数器...最终我们遇到另一个1,然后计数器将重置为1 ...我们再次开始计数......直到下一个1.

有意义吗?

这是它在excel中的工作原理

enter image description here

这就是我的尝试:

vector <- c(NA,1,rep(NA,24),1,NA,NA)
i=1
for( i in 1:length(vector)) {
  start <- ifelse(vector[i + 1]==1,1,vector[i - 1]+1)
}
start

3 个答案:

答案 0 :(得分:2)

这会再现您的预期输出。

x <- vector;
for (i in 1:length(x))
    if (x[i + 1] == 1 & !is.na(x[i + 1])) x[i] = 1 else x[i] = x[i - 1] + 1;
x;
# [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#[26]  1  2  3  4

PS。 vector是R中变量的非常差的名称。

样本数据

vector <- c(NA,1,rep(NA,24),1,NA,NA);

答案 1 :(得分:1)

如果我理解了你之后的事情,你可以这样做:

library(dplyr)
x = c(NA, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, NA, 1, 1, 0, 2, 5, 6, 1, 3)
y = (lead(x)!=1|is.na(lead(x)))
res = cumsum(y)-cummax((cumsum(y)-1)*!y)
[1] 1 2 3 4 5 6 1 2 3 4 5 6 1 1 2 3 4 5 1 2 3

这是对此question的答案之一的建立。

答案 2 :(得分:0)

过了一会儿用for循环计算出来

i=1
start <- NULL
for( i in 1:length(vector)) {
  start[i] <- ifelse(vector[i + 1]==2,1,start[i - 1]+1)
}
start

数据:

 vector <- c(1,2,rep(1,24),2,1,1)