2017-05-29 144 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