2017-07-09 28 views
0

所以我想要做的是在數據框中創建一個從1開始的序列,但是如果它遇到基於另一列的TRUE,它會匹配那些在連續的行中。如何生成一個對應於True和False的序列

例如,在此數據集:

df <- data.frame(date = c("11","12", "13","14","15","16","17","18","19","20","21", "22", "23"), 
    flag = c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE)) 

我想這是輸出:

df <- data.frame(date = c("11","12", "13","14","15","16","17","18","19","20","21", "22", "23"), 
      flag = c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE), 
      id = c(1, 2, 3, 4, 4, 5, 6, 7, 7, 7, 8, 9, 10)) 

記住日期按順序是僅僅是一個例子,因爲我的工作與一個大數據集,所以他們將不會協調。此外,標誌塔與數十列

回答

3

這裏一個數據幀只是一列與data.table

library(data.table) 
i1 <- setDT(df)[, grp := rleid(flag)][, .I[flag & (seq_len(.N)==1)], grp]$V1 
df[, flag1:= flag][i1, flag1 := FALSE][, id := cumsum(!flag1)][, c('flag1', 'grp') := NULL][] 
# date flag id 
# 1: 11 FALSE 1 
# 2: 12 FALSE 2 
# 3: 13 FALSE 3 
# 4: 14 TRUE 4 
# 5: 15 TRUE 4 
# 6: 16 FALSE 5 
# 7: 17 FALSE 6 
# 8: 18 TRUE 7 
# 9: 19 TRUE 7 
#10: 20 TRUE 7 
#11: 21 FALSE 8 
#12: 22 FALSE 9 
1#3: 23 FALSE 10 
+0

感謝一個選項,但找一個沒有數據表的答案,因爲我的數據集是相當大的,並使用數據表相當慢地減慢它 – Ic3MaN911

+0

@ Ic3MaN911 data.table用於大數據集並且非常有效。也許你正在尋找data.frame解決方案(這會很慢) – akrun

相關問題