将当前行与r中的后续行(按日期和组排序)进行比较

将当前行与r中的后续行(按日期和组排序)进行比较,r,if-statement,R,If Statement,我的数据集包含3列(组、日期、值)。对于每一行(组和日期的组合),我想评估该值何时(以天为单位)增加1% df <- read.table(text = "Group Date value A 11/1/17 56 A 11/2/17 51 A 11/3/17 58

我的数据集包含3列(组、日期、值)。对于每一行(组和日期的组合),我想评估该值何时(以天为单位)增加1%

df <- read.table(text =
                    "Group   Date    value
                  A      11/1/17     56
                  A      11/2/17     51
                  A      11/3/17     58
                  A      11/4/17     62
                  A      11/5/17     60
                  A      11/6/17     55
                  A      11/7/17     56
                  A      11/8/17     56
                  A      11/9/17     53
                  B      11/1/17     56
                  B      11/2/17     63
                  B      11/3/17     50
                  B      11/4/17     62
                  B      11/5/17     65
                  B      11/6/17     61
                  B      11/7/17     56
                  B      11/8/17     62 
                  C      11/1/17     50
                  C      11/2/17     62 ", header = T)
第二排的逻辑

# if group == A & (value on 11/3/17 = 58 –  value on 11/2/17 = 51)/ value on 11/2/17 = 51 >= .01 = TRUE THEN (**11/3/17 - 11/2/17 = 1**)
第四排的逻辑

# if group == A & (value on 11/5/17 = 60 –  value on 11/4/17 = 62)/ value on 11/4/17 = 62 >= .01 = FALSE THEN NA

# if group == A & (value on 11/6/17 = 55 –  value on 11/4/17 = 62)/ value on 11/4/17 = 62 >= .01 = FALSE THEN NA

# if group == A & (value on 11/7/17 = 56 –  value on 11/4/17 = 62)/ value on 11/4/17 = 62 >= .01 = FALSE THEN NA

# if group == A & (value on 11/8/17 = 56 –  value on 11/4/17 = 62)/ value on 11/4/17 = 62 >= .01 = FALSE THEN NA

# if group == A & (value on 11/9/17 = 53 –  value on 11/4/17 = 62)/ value on 11/4/17 = 62 >= .01 = FALSE THEN NA 
NA表示当前行(例如11/4/17)的值对于后续行不会增加


这是我到目前为止所拥有的,但是,这是不可伸缩的。如果有更多的日期,那么我需要在If-else语句中手动添加这些日期

shift <- function(x, n){
  c(x[-(seq(n))], rep(NA, n))
}

df= do.call(rbind,by(df,df$Group, transform,next_1_percent_or_higher_change =
                        ifelse(((shift(value,1)-value)/value) >= .01,1,
                               ifelse(((shift(value,2)-value)/value) >= .01,2,
                               ifelse(((shift(value,3)-value)/value) >= .01,3,
                                      ifelse(((shift(value,4)-value)/value) >= .01,4,
                                             ifelse(((shift(value,5)-value)/value) >= .01,5,
                                                    ifelse(((shift(value,6)-value)/value) >= .01,6,
                                                            ifelse(((shift(value,7)-value)/value) >= .01,7,
                                                                  ifelse(((shift(value,8)-value)/value) >= .01,8,
                                                                         ifelse(((shift(value,9)-value)/value) >= .01,9,NA)))))))))))
shift=.01,1,
ifelse(((移位(值,2)-值)/值)>=.01,2,
ifelse(((移位(值,3)-值)/值)>=.01,3,
ifelse(((移位(值,4)-值)/值)>=.01,4,
ifelse(((移位(值,5)-值)/值)>=0.01,5,
ifelse(((移位(值,6)-值)/值)>=.01,6,
ifelse(((移位(值,7)-值)/值)>=.01,7,
ifelse(((移位(值,8)-值)/值)>=.01,8,
ifelse(((移位(值,9)-值)/值)>=.01,9,NA‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘

如果我理解正确,您正在查找的
值与前一行相比变化>1%,仅限于同一
组中的

library(dplyr)

f_flagged_shorter <- f %>%
      group_by(Group) %>%
      mutate(flag = value >= lag(value)*1.01) %>%
      ungroup()
库(dplyr)
f_标记的_更短%
分组依据(分组)%>%
突变(标志=值>=滞后(值)*1.01)%>%
解组()

逻辑不是很清楚。您能指定1、2和NA的时间吗?为什么第1行的值是2,而第5行的值是NA?是的,现在修改了说明。逻辑是当前行与每组值增加1%的行之间的日期差。例如,对于第1行(A组,11/1/17,56),值在2017年11月3日增加了1%,这意味着花了2天时间增加1%(或者,11/3/17-11/1/17=2)。而对于第4行(A组,11/4/17,60),60的值在后续行中不会增加。不,我在寻找
值何时(以天为单位的持续时间)增加1%。在我想要的输出中,我想要一个名为'rease_by_1%`的新列,它指示每行的值和限制为组的值何时增加1%。例如,第一行(即A,11/1/17,56)用了2天时间才增加1%。第二排(A,11/2/17,51)花了1天时间才增加了1%。好吧,也许我现在明白了。是这样吗?对于每个日期,查找到组中的下一个日期所需的天数,该日期的值将比当前水平增加1%。是的,这就是我要查找的
shift <- function(x, n){
  c(x[-(seq(n))], rep(NA, n))
}

df= do.call(rbind,by(df,df$Group, transform,next_1_percent_or_higher_change =
                        ifelse(((shift(value,1)-value)/value) >= .01,1,
                               ifelse(((shift(value,2)-value)/value) >= .01,2,
                               ifelse(((shift(value,3)-value)/value) >= .01,3,
                                      ifelse(((shift(value,4)-value)/value) >= .01,4,
                                             ifelse(((shift(value,5)-value)/value) >= .01,5,
                                                    ifelse(((shift(value,6)-value)/value) >= .01,6,
                                                            ifelse(((shift(value,7)-value)/value) >= .01,7,
                                                                  ifelse(((shift(value,8)-value)/value) >= .01,8,
                                                                         ifelse(((shift(value,9)-value)/value) >= .01,9,NA)))))))))))
library(dplyr)

f_flagged_shorter <- f %>%
      group_by(Group) %>%
      mutate(flag = value >= lag(value)*1.01) %>%
      ungroup()