2017-05-29 143 views
0

問題是類似於(Update) Add index column to data.frame based on two columns創建索引列

這裏我的例子data.frame:

df = read.table(text = 'ID Day Count Count_group 
77661 14498 4 5 
76552 14498 4 5 
37008 14498 4 5 
34008 14498 4 5 
30004 14497 1 5 
30004 14497 1 4 
28047 14496 3 4 
28049 14496 3 4 
29003 14496 3 4 
69012 14468 1 4 
69007 14467 3 4 
69012 14467 3 4 
69020 14467 3 4 
42003 13896 2 4 
42011 13896 2 4 
22001 13895 2 4 
23007 13895 2 4 
28047 14496 3 3 
28049 14496 3 3 
29003 14496 3 3 
69007 14467 3 3 
69012 14467 3 3 
69020 14467 3 3 
48005 14271 2 2 
48007 14271 2 2 
22001 13895 2 2 
23007 13895 2 2 
47011 14320 1 2 
73005 14319 1 2 
73005 14319 1 1', header = TRUE) 

Count COL顯示ID值的總和按Day分組。 Count_group顯示按DayDay -1分組的唯一Count值的總和。

我需要創建一個索引列該組Count_group通過DayDay -1df從高到低的順序(有重複!)。

這裏我預期的輸出:DayDay -1Day -2

df_2 = read.table(text = 'ID Day Count Count_group 
30004 14497 1 5 
28047 14496 3 5 
28049 14496 3 5 
29003 14496 3 5 
69012 14495 1 5 
69007 14467 3 5 
69012 14467 3 5 
69020 14467 3 5 
42003 14466 1 5 
42011 14465 1 5 
28047 14496 3 4 
28049 14496 3 4 
29003 14496 3 4 
69012 14995 1 4 
22001 13895 2 4 
23007 13895 2 4 
28047 13894 2 4 
28049 13894 2 4 
42003 14466 1 2 
42011 14465 1 2 
28047 13894 2 2 
28049 13894 2 2 
69012 14995 1 1 
42011 14465 1 1', header = TRUE) 

預期輸出:

ID  Day Count Count_group index_col 
30004 14497 1 5   1 
28047 14496 3 5   1 
28049 14496 3 5   1 
29003 14496 3 5   1 
69012 14495 1 5   1 
69007 14467 3 5   2 
69012 14467 3 5   2 
69020 14467 3 5   2 
42003 14466 1 5   2 
42011 14465 1 5   2 
28047 14496 3 4   3 
28049 14496 3 4   3 
29003 14496 3 4   3 
69012 14995 1 4   3 
22001 13895 2 4   4 
23007 13895 2 4   4 
28047 13894 2 4   4 
28049 13894 2 4   4 
42003 14466 1 2   5 
42011 14465 1 2   5 
28047 13894 2 2   6 
28049 13894 2 2   6 
69012 14995 1 1   7 
42011 14465 1 1   8 

ID  Day Count Count_group index_col 
77661 14498 4 5   1 
76552 14498 4 5   1 
37008 14498 4 5   1 
34008 14498 4 5   1 
30004 14497 1 5   1 
30004 14497 1 4   2 
28047 14496 3 4   2 
28049 14496 3 4   2 
29003 14496 3 4   2 
69012 14468 1 4   3 
69007 14467 3 4   3 
69012 14467 3 4   3 
69020 14467 3 4   3 
42003 13896 2 4   4 
42011 13896 2 4   4 
22001 13895 2 4   4 
23007 13895 2 4   4 
28047 14496 3 3   5 
28049 14496 3 3   5 
29003 14496 3 3   5 
69007 14467 3 3   6 
69012 14467 3 3   6 
69020 14467 3 3   6 
48005 14271 2 2   7 
48007 14271 2 2   7 
22001 13895 2 2   8 
23007 13895 2 2   8 
47011 14320 1 2   9 
73005 14319 1 2   9 
73005 14319 1 1   10 

而且3天做相同,但與index_col分組

你有什麼建議嗎? Stion的? 我希望創建一個通用代碼,可以應用(通過一些調整)到df,df_2和其他具有n天分組變量的data.frames。

+1

我認爲這是在第5行的'df_2'一個錯字,值'日'。它應該是14495,保證14995。 – rconradin

+0

問題與新更新的DF – aaaaa

+0

是否有可能有這樣出頭: '76552 14498 3 4 \ n 37008 14498 3 4 \ n 34008 14498 3 4 \ n 30004 14497 1 4 \ n 30004 14497 1 4' ?那麼計算列「Count」的過程是什麼,因爲它不理解如何通過Count = 1來得到5-6行。 – rconradin

回答

2

使用dplyr

df %>% mutate(index_col = cumsum(!c(+Inf,diff(Day))%in%c(0,-1))) 

說明

c(+Inf,diff(Day)) 

當你想連續兩天,我計算的Daydiff(Day)的差異。由於diff返回大小爲n-1的向量,我必須爲該向量的頂部添加一個值,我選擇+Inf

!(... %in% c(0,-1)) 

我測試的值相同DayDay-1,因爲它們必須進行分組,我想在這情況並非如此。

cumsum(...) 

最後,我用cumsum知道有多少變化的發生。

輸出:

這工作你的兩個exemples

> df %>% mutate(index_col = cumsum(!c(+Inf,diff(Day))%in%c(0,-1))) 

     ID Day Count Count_group index_col 
1 30004 14497  1   4   1 
2 28047 14496  3   4   1 
3 28049 14496  3   4   1 
4 29003 14496  3   4   1 
5 69012 14468  1   4   2 
6 69007 14467  3   4   2 
7 69012 14467  3   4   2 
8 69020 14467  3   4   2 
9 42003 13896  2   4   3 
10 42011 13896  2   4   3 
11 22001 13895  2   4   3 
12 23007 13895  2   4   3 
13 28047 14496  3   3   4 
14 28049 14496  3   3   4 
15 29003 14496  3   3   4 
16 69007 14467  3   3   5 
17 69012 14467  3   3   5 
18 69020 14467  3   3   5 
19 48005 14271  2   2   6 
20 48007 14271  2   2   6 
21 22001 13895  2   2   7 
22 23007 13895  2   2   7 
23 47011 14320  1   2   8 
24 73005 14319  1   2   8 
25 73005 14319  1   1   8 

> df_2 %>% mutate(index_col = cumsum(!c(+Inf,diff(Day))%in%c(0,-1))) 

     ID Day Count Count_group index_col 
1 30004 14497  1   5   1 
2 28047 14496  3   5   1 
3 28049 14496  3   5   1 
4 29003 14496  3   5   1 
5 69012 14495  1   5   1 
6 69007 14467  3   5   2 
7 69012 14467  3   5   2 
8 69020 14467  3   5   2 
9 42003 14466  1   5   2 
10 42011 14465  1   5   2 
11 28047 14496  3   4   3 
12 28049 14496  3   4   3 
13 29003 14496  3   4   3 
14 69012 14495  1   4   3 
15 22001 13895  2   4   4 
16 23007 13895  2   4   4 
17 28047 13894  2   4   4 
18 28049 13894  2   4   4 
19 42003 14466  1   2   5 
20 42011 14465  1   2   5 
21 28047 13894  2   2   6 
22 28049 13894  2   2   6 
23 69012 14995  1   1   7 
24 42011 14465  1   1   8 
+0

嗨,謝謝。我用一個新的例子df更新了我的問題。 – aaaaa