r-dplyr mutate引用新列本身

r-dplyr mutate引用新列本身,r,dplyr,R,Dplyr,我有一个这样的数据框,名为“a” ID V1 1 -1 1 0 1 1 1 1000 1 0 1 1 2 -1 2 0 2 1000 ... 我将缩短此数据框以简要显示 现在我想使用条件mutate函数创建一个新列,但它应该引用mutate函数创建的新

我有一个这样的数据框,名为“a”

   ID        V1
   1         -1 
   1          0 
   1          1 
   1        1000 
   1          0 
   1          1
   2         -1 
   2          0 
   2         1000 


...
我将缩短此数据框以简要显示

现在我想使用条件mutate函数创建一个新列,但它应该引用mutate函数创建的新列

a %>%
  group_by(ID) %>%
    mutate(V2, ifelse(row_number() == 1, 1, 
      ifelse(V1 < 1000, 1,
      ifelse(V1 >= 1000, lag(V2) + 1))
我怎么才能得到这个?谢谢你的帮助。

我们可以试试

a %>%
     group_by(ID) %>% 
     mutate(V2 = cumsum(V1 >= 1000)+1L)
#     ID    V1    V2
#  <int> <int> <int>
#1     1    -1     1
#2     1     0     1
#3     1     1     1
#4     1  1000     2
#5     1     0     2
#6     1     1     2
#7     2    -1     1
#8     2     0     1
#9     2  1000     2
a%>%
分组依据(ID)%>%
突变(V2=cumsum(V1>=1000)+1L)
#ID V1 V2
#    
#1     1    -1     1
#2     1     0     1
#3     1     1     1
#4     1  1000     2
#5     1     0     2
#6     1     1     2
#7     2    -1     1
#8     2     0     1
#9     2  1000     2
数据
a我们可以试试

a %>%
     group_by(ID) %>% 
     mutate(V2 = cumsum(V1 >= 1000)+1L)
#     ID    V1    V2
#  <int> <int> <int>
#1     1    -1     1
#2     1     0     1
#3     1     1     1
#4     1  1000     2
#5     1     0     2
#6     1     1     2
#7     2    -1     1
#8     2     0     1
#9     2  1000     2
a%>%
分组依据(ID)%>%
突变(V2=cumsum(V1>=1000)+1L)
#ID V1 V2
#    
#1     1    -1     1
#2     1     0     1
#3     1     1     1
#4     1  1000     2
#5     1     0     2
#6     1     1     2
#7     2    -1     1
#8     2     0     1
#9     2  1000     2
数据
a这应该可以:

a %>% group_by(ID) %>% mutate(V2 = ifelse(row_number() == 1, 1, 0) + 
                                ifelse(row_number() > 1 & V1 <= 1000, 1, 0) + 
                                cumsum(ifelse(V1 >= 1000, 1, 0)))
a%%>%group\u by(ID)%%>%mutate(V2=ifelse(row\u number()==1,1,0)+
ifelse(行号()>1&V1=1000,1,0)))
更新:将第二条ifelse逻辑语句从行编号()>1&V1<1000更改为如上所示。此更改应给出注释中要求的结果。

这应适用于:

a %>% group_by(ID) %>% mutate(V2 = ifelse(row_number() == 1, 1, 0) + 
                                ifelse(row_number() > 1 & V1 <= 1000, 1, 0) + 
                                cumsum(ifelse(V1 >= 1000, 1, 0)))
a%%>%group\u by(ID)%%>%mutate(V2=ifelse(row\u number()==1,1,0)+
ifelse(行号()>1&V1=1000,1,0)))

更新:将第二条ifelse逻辑语句从行编号()>1&V1<1000更改为如上所示。此更改应给出注释中要求的结果。

这不应该是
滞后(V1)
?不,它指的是V2本身。因此,您想要的是:对于每个id,当V1等于或大于1000时,V2将加1?@zyrnaidi是的,完全正确!这不应该是滞后(V1)
?不,它指的是V2本身。所以,你想要的是:对于每个id,当V1等于或大于1000时,V2加起来就是1?@zyurnaidi是的,没错!这个答案似乎很有效。但结果是(V1=1000&V2=1),然后是下一个V2=2。我马上就要(V1=1000&V2=2)。你可以使用row_number()>1&V1这个答案似乎很有效。但结果是(V1=1000&V2=1),然后是下一个V2=2。我想马上(V1=1000&V2=2)。你可以使用row_number()>1&V1@LuisKang,我只使用了你的示例数据集。如果您已经加载了
plyr
以及
dplyr
,您可以尝试
dplyr::mutate(V2=…
它的工作原理与我将cumsum(V1==1000)更改为cumsum(V1>=1000)一样。谢谢!@LuisKang我只使用了您的示例数据集。如果您已经加载了
plyr
以及
dplyr
,您可以尝试
dplyr::mutate(V2=…
当我将cumsum(V1==1000)更改为cumsum(V1>=1000)时,它就起作用了。谢谢!