R 定义新变量,若另一个变量的下一行满足条件,则取1

R 定义新变量,若另一个变量的下一行满足条件,则取1,r,if-statement,plyr,calculated-columns,R,If Statement,Plyr,Calculated Columns,因此,我试图为事件历史分析设置数据集,为此,我需要定义一个新列。我的数据集的格式如下: ID Var1 1 10 1 20 1 30 1 10 2 4 2 5 2 10 2 5 3 1 3 15 3 20 3 9 4 18 4 32 4 NA 4 12 5 2 5 NA 5 8 5 3 ID Var1 Var2 1 10 0 1 20

因此,我试图为事件历史分析设置数据集,为此,我需要定义一个新列。我的数据集的格式如下:

ID   Var1
1    10
1    20  
1    30  
1    10
2    4
2    5
2    10
2    5
3    1
3    15
3    20
3    9
4    18
4    32
4    NA
4    12
5    2
5    NA
5    8
5    3
ID   Var1   Var2
1    10      0
1    20      0
1    30      1
1    10      0
2    4       0
2    5       0
2    10      0
2    5       0
3    1       0
3    15      0
3    20      1
3    9       0
4    18      0
4    32      NA
4    NA      1
4    12      0
5    2       NA
5    NA      0
5    8       1
5    3       0
我想得到以下表格:

ID   Var1
1    10
1    20  
1    30  
1    10
2    4
2    5
2    10
2    5
3    1
3    15
3    20
3    9
4    18
4    32
4    NA
4    12
5    2
5    NA
5    8
5    3
ID   Var1   Var2
1    10      0
1    20      0
1    30      1
1    10      0
2    4       0
2    5       0
2    10      0
2    5       0
3    1       0
3    15      0
3    20      1
3    9       0
4    18      0
4    32      NA
4    NA      1
4    12      0
5    2       NA
5    NA      0
5    8       1
5    3       0
换句话说:我希望新变量指示,如果
Var1
(相对于组)的值下降到该组
Var1
达到的最大值的50%以下。最后一个值是NA还是0并不重要,尽管从理论角度来看,
NA
更有意义。 我试过用类似的东西

DF$Var2 <- df %>%
  group_by(ID) %>%
  ifelse(df == ave(df$Var1,df$ID, FUN = max), 0,1)
DF$Var2%
分组依据(ID)%>%
ifelse(df==ave(df$Var1,df$ID,FUN=max),0,1)
然后将其延迟1,但在ifelse中未使用的参数1上返回错误


感谢您的解决方案

这里是通过
ave
+
cummax

within(df,Var2 <- ave(Var1,ID,FUN = function(x) c((x<max(x)/2 & cummax(x)==max(x))[-1],0)))

编辑(更新后的帖子)


f您的预期输出是否正确?尝试类似于
df%>%groupby(ID)%>%mutate(Var2=as.integer(Var1>0.5*max(Var1)))
非常感谢您的回答,它给出了预期的结果。但是有一个问题:一些组在Var1中包含一些NA,如果有一个NA,代码将完整的列Var2作为NA返回。我尝试用ifelse语句解决它,但它一直返回错误。有没有简单、直接的方法来解决这个问题?@philipp.kn_98不客气。您能否提供一个在Var1中包含NAs的小示例以及预期结果?然后我会再次尝试,只是编辑了问题以提供信息。到目前为止,代码为第4组和第5组中的整个列返回NA,而所需的输出只是将NAs上移了一行(逻辑问题是:下一行得分是否低于XY阈值?)。谢谢你的努力@你能解释一下为什么
ID=4
ID=5
Var2
是这样的吗?我对它的逻辑一无所知。例如,当
ID=4
时,行
Var1=32
给出
Var2=NA
,但是为什么
Var2=1
当下一行有
Var1=NA
时?@philipp.kn\u 98我更新了我的答案,请检查这是否适用于您
f <- function(v) {
  u1 <- c(replace(v,!is.na(v),0),0)[-1]
  v[is.na(v)] <- v[which(is.na(v))-1]
  u2 <- c((v<max(v)/2 & cummax(v)==max(v))[-1],0)
  u1+u2
}

within(df,Var2 <- ave(Var1,ID,FUN = f))
> within(df,Var2 <- ave(Var1,ID,FUN = f))
   ID Var1 Var2
1   1   10    0
2   1   20    0
3   1   30    1
4   1   10    0
5   2    4    0
6   2    5    0
7   2   10    0
8   2    5    0
9   3    1    0
10  3   15    0
11  3   20    1
12  3    9    0
13  4   18    0
14  4   32   NA
15  4   NA    1
16  4   12    0
17  5    2   NA
18  5   NA    0
19  5    8    1
20  5    3    0
df <- tructure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L,    
3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L), Var1 = c(10L, 20L, 30L, 
10L, 4L, 5L, 10L, 5L, 1L, 15L, 20L, 9L, 18L, 32L, NA, 12L, 2L,   
NA, 8L, 3L)), class = "data.frame", row.names = c(NA, -20L))