R 基于值拆分ID

R 基于值拆分ID,r,dplyr,tidyr,R,Dplyr,Tidyr,我有一个大的data.frame,有p列和n行。 我想更改ID,即如果获得值1,则分割帧。但是,对于每个ID,该值可能会出现多次,因此变得棘手。 我在考虑下订单,所以每次df$Value==1时,该行的df$order==1(接下来,2…直到df$Value==1) 但它并没有真正给我想要的。 有什么建议吗?这里有一个使用数据的选项。表 library(data.table) setDT(df)[, ID := seq(0, 1, by = 0.1)[shift(cumsum(Value==1)

我有一个大的data.frame,有p列和n行。
我想更改ID,即如果获得值1,则分割帧。但是,对于每个ID,该值可能会出现多次,因此变得棘手。
我在考虑下订单,所以每次df$Value==1时,该行的df$order==1(接下来,2…直到df$Value==1)

但它并没有真正给我想要的。

有什么建议吗?

这里有一个使用
数据的选项。表

library(data.table)
setDT(df)[, ID := seq(0, 1, by = 0.1)[shift(cumsum(Value==1), fill=0)+1] + ID, ID]

或与
dplyr相同

library(dplyr)
df %>%
  group_by(ID) %>%
  mutate(ID1 = seq(0, 1, by = 0.1)[lag(cumsum(Value==1), default=0)+1] + ID) %>%
  ungroup() %>%
  mutate(ID = ID1) %>%
  select(-ID1)
# A tibble: 15 × 2
#      ID Value
#   <dbl> <dbl>
#1    1.0     0
#2    1.0     0
#3    1.0     1
#4    2.0     0
#5    2.0     0
#6    2.0     1
#7    2.1     0
#8    2.1     1
#9    2.2     1
#10   2.3     0
#11   3.0     0
#12   3.0     0
#13   3.0     1
#14   3.1     0
#15   3.1     1
库(dplyr)
df%>%
分组依据(ID)%>%
变异(ID1=seq(0,1,by=0.1)[滞后(累积和(值==1),默认值=0)+1]+ID]%>%
解组()%>%
突变(ID=ID1)%>%
选择(-ID1)
#一个tibble:15×2
#ID值
#    
#1    1.0     0
#2    1.0     0
#3    1.0     1
#4    2.0     0
#5    2.0     0
#6    2.0     1
#7    2.1     0
#8    2.1     1
#9    2.2     1
#10   2.3     0
#11   3.0     0
#12   3.0     0
#13   3.0     1
#14   3.1     0
#15   3.1     1

i我对data.table不是很有信心。但我理解dplyr解决方案,这是一种非常聪明的方法。谢谢
library(data.table)
setDT(df)[, ID := seq(0, 1, by = 0.1)[shift(cumsum(Value==1), fill=0)+1] + ID, ID]
library(dplyr)
df %>%
  group_by(ID) %>%
  mutate(ID1 = seq(0, 1, by = 0.1)[lag(cumsum(Value==1), default=0)+1] + ID) %>%
  ungroup() %>%
  mutate(ID = ID1) %>%
  select(-ID1)
# A tibble: 15 × 2
#      ID Value
#   <dbl> <dbl>
#1    1.0     0
#2    1.0     0
#3    1.0     1
#4    2.0     0
#5    2.0     0
#6    2.0     1
#7    2.1     0
#8    2.1     1
#9    2.2     1
#10   2.3     0
#11   3.0     0
#12   3.0     0
#13   3.0     1
#14   3.1     0
#15   3.1     1