例如,如果我有以下记录:
A B
1 2
2 3
3 1
1 2
2 1
假设一个周期从1(到2到3)回到1,所以我需要我的数据框就像
No. A B
cycle1 1 2
cycle1 2 3
cycle1 3 1
cycle2 1 2
cycle2 2 1
或者对我来说更好的方式,我只需要记录相同记录的出现时间,例如
Time A B
Time1 1 2
Time1 2 3
Time1 3 1
Time2 1 2
Time1 2 1
我需要这样做,因为我必须在dplyr中使用汇总函数来进行计算,但我无法直接按A和B对数据进行分组。数据的顺序也很重要。
答案 0 :(得分:2)
library(zoo)
T1=which(df$A==1)
T2=1:length(T1)
T2=paste('cycle',T2 )
df$No=NA
df$No[T1]=T2
df$No=na.locf(df$No)
df
A B No
1 1 2 cycle 1
2 2 3 cycle 1
3 3 1 cycle 1
4 1 2 cycle 2
5 2 1 cycle 2
#the reason: keep the row Id with the calculation
library(dplyr)
df%>%group_by(A,B)%>%mutate(Time=paste('Time',row_number()))
A B Time
<int> <int> <chr>
1 1 2 Time 1
2 2 3 Time 1
3 3 1 Time 1
4 1 2 Time 2
5 2 1 Time 1
答案 1 :(得分:1)
创建一个增强的'diff'变量。 c(NA,diff(your_var))。在序列组中,这将是1.将您的组设置为更改该命题的逻辑虚假。 (我对算法的第一次迭代不太正确,所以稍微修改一下。)
dat %>% as_tibble() %>% mutate(G = cumsum( c(-1, diff(A)) < 0 ) )
# A tibble: 5 x 3
A B G
<int> <int> <int>
1 1 2 1
2 2 3 1
3 3 1 1
4 1 2 2
5 2 1 2
dat %>% as_tibble() %>% mutate(G = paste0( "time", cumsum( c(-1, diff(A)) < 0 ) ))
# A tibble: 5 x 3
A B G
<int> <int> <chr>
1 1 2 time1
2 2 3 time1
3 3 1 time1
4 1 2 time2
5 2 1 time2
也可以测试A = 1,但是1,2,3,2,3,4之类的序列不会被正确分割。