dplyr如何计算记录中的周期

时间:2017-06-22 03:27:55

标签: r dplyr

例如,如果我有以下记录:

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对数据进行分组。数据的顺序也很重要。

2 个答案:

答案 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之类的序列不会被正确分割。