我有这个载体:
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中的工作原理
这就是我的尝试:
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
答案 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)