在两个向量之间循环以满足三个条件

时间:2014-07-08 19:58:49

标签: r function loops

我有一个包含4列数据的csv文件。我需要从csv文件中选择第一列,我喜欢这样:

file1<-read.csv("file1.csv",header=TRUE)
x<-file[,1]

第一列包含(x,此处)包含行号。

x
5
10
54
177
178
182
183
184
185
203
204
205
206
207
208

现在还有另一个csv文件,其中包含一列365行数据

y<-read.csv("data.csv",header=TRUE)

y
0
2.3
0.5
21
0
.
.
.
9.5 #total 365 numbers

这就是我打算做的事情:

1)从x开始,选择第一个数字(即5)

2)在y中,选择相应的第5个数据点(为0)和之前的4个数据点(为21,0.5,2.3,0),然后分别测试以下条件

条件1:从5个数据点开始,如果五个中的三个是> 0,然后打印5(步骤1的结果)

条件2:如果五个中的全部四个都> 0,则再次打印5

条件3:如果五个中的全部都是> 0,则再次打印5

但是,如果满足三个条件,只满足前两个条件而不满足第三个条件,则从x中选择第二个数字(本例中为10)并再次选择y中相应的第10个数据点和4个数据在它之前的点(第6,7,8和9)并评估它们的第三个条件(即如果所有五个数字 - 第6,7,8,9和10都是> 0,我不需要评估第一个和x)中前一个数字已满足的第二个条件,然后保存10并停止。

对于我的一个虚弱的头脑来说这听起来很复杂(从我的声誉可以看出),并且希望有人能告诉我如何在R中这样做。

非常感谢

1 个答案:

答案 0 :(得分:1)

听起来你需要一个while循环。

file1 <- data.frame(x=seq(5, 205, by=5))
file1
x <- file1[, 1]

set.seed(123)
file2 <- data.frame(y=rnorm(365))
y <- file2[, 1]

# flags for each condition
cond1 <- FALSE
cond2 <- FALSE
cond3 <- FALSE

k <- 0
while(!cond3) {  
  k <- k + 1

  # select first number
  num <- x[k]

  # select all y's up to data point
  all.y <- y[(num-4):num]

  # number of positive values
  chk.pos <- length(which(all.y > 0))

  # condition 1: check if 3 of 5 are positive
  cnt <- 0
  if (!cond1 & chk.pos >= 3) {
    cnt <- cnt + 1
    cond1 <- TRUE
    print(num)
  }

  # condition 2:  check if 4 of 5 are positive
  if (!cond2 & chk.pos >= 4) {
    cnt <- cnt + 1
    cond2 <- TRUE
    print(num)
  }

  # condition 3:  check if 5 of 5 are positive
  if (!cond3 & chk.pos == 5) {
    cnt <- cnt + 1
    cond3 <- TRUE
    print(num)
  }

}

对我来说

[1] 5
[1] 15
[1] 70