Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
r测试列中的条件,如果不满足,则移动到下一个数字并再次测试_R_Loops - Fatal编程技术网

r测试列中的条件,如果不满足,则移动到下一个数字并再次测试

r测试列中的条件,如果不满足,则移动到下一个数字并再次测试,r,loops,R,Loops,这对我来说相当复杂,如果有人能告诉我如何解决这个问题,我将不胜感激。My dataframe有两列: dat <- structure(list(day = 172:208, x = c(0.14, 0.02, 0.09, 3.06, 3.21, 4.15, 6.24, 6.27, 3.31, 6.28, 16.9, 20.1, 2

这对我来说相当复杂,如果有人能告诉我如何解决这个问题,我将不胜感激。My dataframe有两列:

dat <- structure(list(day = 172:208,
                      x = c(0.14, 0.02, 0.09, 3.06, 3.21, 
                            4.15, 6.24, 6.27, 3.31, 6.28, 
                            16.9, 20.1, 20.29, 20.45, 17.52, 
                            6.22, 1.14, 0.84, 0.68, 0.49, 
                            0.22, 0.01, 0.01, 0.6, 0.64, 0.64, 
                            0.66, 0.69, 0.15, 0.15, 3.16, 
                            3.44, 3.42, 3.37, 3.51, 2.77, 3.51
                      )),
                 .Names = c("day", "x"),
                 class = "data.frame", row.names = c(NA,-37L))

dat
  day      x 
 172    0.14
 173    0.02
 174    0.09
 175    3.06
 176    3.21
 177    4.15
 178    6.24
 179    6.27
 180    3.31
 181    6.28
 182    16.90
 183    20.10
 184    20.29
 185    20.45
 186    17.52
 187    6.22
 188    1.14
 189    0.84
 190    0.68
 191    0.49
 192    0.22
 193    0.01
 194    0.01
 195    0.60
 196    0.64
 197    0.64
 198    0.66
 199    0.69
 200    0.15
 201    0.15
 202    3.16
 203    3.44
 204    3.42
 205    3.37
 206    3.51
 207    2.77
 208    3.51
2) 对于x大于2.3的一天,计算接下来3天x的百分比变化。例如,对于175天,x为3.06(>2.3),因此对于接下来3个连续的x值(3.21-第176天,4.15-第177天,6.24-第178天),请执行以下操作:

(3.21 - 3.06)*100/3.06 = 4.9
(4.15 - 3.21)*100/3.21 = 0.29
(6.24 - 4.15)*100/4.15 = 50.36
如果上述三个值都大于-30,则将中间日期从176、177和178存储在单独的向量中(在本例中,存储177)

3) 如果三个值小于-30,则再次从179(>2.3 mm)开始,并在第180、181和182天重复步骤2

   (3.31 - 6.27)*100/6.27 = -47.2
   (6. 28 - 3.31)*100/3.31 = 89.72
   (16.9 - 6.28) * 100/6.28 = 169.1
如果所有值都大于-30,则存储中间日期(181)。在这种情况下,其中一个值小于-30,因此不要存储任何内容,从183(>2.3 mm)开始重新开始,然后重复184、185和186。如果上述三个值中的一个值再次小于-30,则从第187天开始(x>2.3),并在第188189天和第190天重复步骤2。如果三个值中有一个值小于-30,则从202开始计算(因为对于202,x>2.3)

我真的很抱歉,我没有太多的编程经验在这里的r,因此张贴这个问题,这已经困扰了我相当长一段时间


非常感谢

通过使用新的(ish)
dplyr
软件包,我们可以在没有任何循环的情况下解决此问题:

library(dplyr)
library(magrittr)
让我们首先计算百分比变化,作为一个新列:

dat <- dat %>%
  mutate(change = (x-lag(x))/lag(x)*100)
然后,使用这些组下标(
ss
)来提取必要的
dat行。在继续之前,让我们先看看新数据帧的顶部:

grps %>%
  do(data.frame(.,dat[.$ss,])) %>%
  head

   group ss day     x     change
5      1  5 176  3.21   4.901961
6      1  6 177  4.15  29.283489
7      1  7 178  6.24  50.361446
9      2  9 180  3.31 -47.208931
10     2 10 181  6.28  89.728097
11     2 11 182 16.90 169.108280
如您所见,第176、177和178天的值与示例中的值完全匹配。这是一个我们需要中间数字的组,因为所有的
change
都大于-30。但是,我们不会使用181,因为该组(“
group2
”)中的
change
的一个值小于-30。同样,这与原始问题相符

然后按
分组
(将数据保存为3组)。最后,通过change>-30过滤数据,并仅选择中间一行:

grps %>%
  do(data.frame(.,dat[.$ss,])) %>%
  group_by(group) %>%
  filter(all(change > -30)) %>%
  do(.[2,])

  group ss day     x     change
1     1  6 177  4.15 29.2834891
2     3 14 185 20.45  0.7885658
3     6 26 197  0.64  0.0000000
4     8 34 205  3.37 -1.4619883

通过使用新的(ish)
dplyr
包,我们可以在没有任何循环的情况下解决此问题:

library(dplyr)
library(magrittr)
让我们首先计算百分比变化,作为一个新列:

dat <- dat %>%
  mutate(change = (x-lag(x))/lag(x)*100)
然后,使用这些组下标(
ss
)来提取必要的
dat行。在继续之前,让我们先看看新数据帧的顶部:

grps %>%
  do(data.frame(.,dat[.$ss,])) %>%
  head

   group ss day     x     change
5      1  5 176  3.21   4.901961
6      1  6 177  4.15  29.283489
7      1  7 178  6.24  50.361446
9      2  9 180  3.31 -47.208931
10     2 10 181  6.28  89.728097
11     2 11 182 16.90 169.108280
如您所见,第176、177和178天的值与示例中的值完全匹配。这是一个我们需要中间数字的组,因为所有的
change
都大于-30。但是,我们不会使用181,因为该组(“
group2
”)中的
change
的一个值小于-30。同样,这与原始问题相符

然后按
分组
(将数据保存为3组)。最后,通过change>-30过滤数据,并仅选择中间一行:

grps %>%
  do(data.frame(.,dat[.$ss,])) %>%
  group_by(group) %>%
  filter(all(change > -30)) %>%
  do(.[2,])

  group ss day     x     change
1     1  6 177  4.15 29.2834891
2     3 14 185 20.45  0.7885658
3     6 26 197  0.64  0.0000000
4     8 34 205  3.37 -1.4619883

好的,你能在x>2.3的每天重复这个吗?即使它们是连续的?不,我不会每天重复。比如说,如果一天>2.3,那么接下来的三天,做百分比的事情。然后移到第四天。我不需要回到三天时间再次测试x>2.3。对不起,我的问题不清楚。在您的示例中,第176、177和178天的x均大于2.3。所以你从第176天开始做3天间隔百分比的事情,以此类推。完成后,您是否希望从第177天开始成为另一个3天间隔的算法?或者它被排除在外,因为它包含在从176开始的间隔中?嗨,谢谢。177将被排除在外,因为它包含在间隔中。我希望我早知道这一点;看起来我刚解决了一个与你不同的问题!因此,在您的示例中,您只需要从第175天开始定义3人一组!所以只有11组3人。是这样吗?好的,你能在x>2.3的每天重复这个吗?即使它们是连续的?不,我不会每天重复。比如说,如果一天>2.3,那么接下来的三天,做百分比的事情。然后移到第四天。我不需要回到三天时间再次测试x>2.3。对不起,我的问题不清楚。在您的示例中,第176、177和178天的x均大于2.3。所以你从第176天开始做3天间隔百分比的事情,以此类推。完成后,您是否希望从第177天开始成为另一个3天间隔的算法?或者它被排除在外,因为它包含在从176开始的间隔中?嗨,谢谢。177将被排除在外,因为它包含在间隔中。我希望我早知道这一点;看起来我刚解决了一个与你不同的问题!因此,在您的示例中,您只需要从第175天开始定义3人一组!所以只有11组3人。是吗?谢谢。我将尝试使用我的数据集,并会让您知道。非常感谢您抽出时间。这个看起来不错。但它并没有给出预期的结果。例如,即使i)179>2.3,以及ii)从180到181的百分比变化以及从181到182的百分比变化大于-30,它也不会选择181(因此它应该选择中间日期i,即181)。相反,它选择197,但195不大于2.3,并且从196到197和从197到198的百分比变化大于-30。但还是要感谢你的时间和努力。我将试着阅读整个软件包,看看是否可以调整您的解决方案以适合我的解决方案。相反,181不应该被选中(因为180的更改是-47,这是同一组中的三个)。正如您在上面的问题中所说,“在这种情况下,其中一个值小于-30,因此不要存储任何内容,然后从183开始重新开始”谢谢。我将用我的数据集和