2015-07-03 89 views
0

我有下面的数据帧每一行创建独特的计数变量:基于GROUP_BY变量

help <- data.frame(id = c(5,5,5,5,5,12,12,12,17,17,20,20,20,20,20,20), 
        number = c(1,2,3,4,5,1,2,3,1,2,1,2,3,4,5,6), 
        episode = c(1,1,1,2,2,1,1,1,1,1,1,1,1,2,2,3)) 


    id number episode 
1 5  1  1 
2 5  2  1 
3 5  3  1 
4 5  4  2 
5 5  5  2 
6 12  1  1 
7 12  2  1 
8 12  3  1 
9 17  1  1 
10 17  2  1 
11 20  1  1 
12 20  2  1 
13 20  3  1 
14 20  4  2 
15 20  5  2 
16 20  6  3 

我有一些意见可变number每个ID,也希望每一集内的唯一计数。

我希望为DF看起来像

id number episode number.ep 
1 5  1  1   1 
2 5  2  1   2 
3 5  3  1   3 
4 5  4  2   1 
5 5  5  2   2 
6 12  1  1   1 
7 12  2  1   2 
8 12  3  1   3 
9 17  1  1   1 
10 17  2  1   2 
11 20  1  1   1 
12 20  2  1   2 
13 20  3  1   3 
14 20  4  2   1 
15 20  5  2   2 
16 20  6  3   1 

我使用GROUP_BY(ID)后点击我发生变异命令中的错误。有什么建议么?使用dplyr

+2

你跑什么码?你准确得到什么错误? – MrFlick

+0

我试过'group_by(id)%>%mutate(number.ep = count(n)))',其中许多不同的变体的错误是'错误:没有适用于'group_by_'的方法应用于类的对象“c('integer','numer')”' – bpace

+0

有趣的是,这种操作的用例究竟是什么?我会看到新的情节编号如何触发重新启动索引或计数变量。这个逻辑究竟解决了什么应用? – jxramos

回答

3

这可能是一个选项

library(dplyr) 
help %>% group_by(id, episode) %>% 
     mutate(number.ep = seq(1, length(episode), by = 1)) 

# id number episode number.ep 
#1 5  1  1   1 
#2 5  2  1   2 
#3 5  3  1   3 
#4 5  4  2   1 
#5 5  5  2   2 
#6 12  1  1   1 
#7 12  2  1   2 
#8 12  3  1   3 
#9 17  1  1   1 
#10 17  2  1   2 
#11 20  1  1   1 
#12 20  2  1   2 
#13 20  3  1   3 
#14 20  4  2   1 
#15 20  5  2   2 
#16 20  6  3   1 

这相当于使用data.table将是

library(data.table) 
setDT(help)[, number.ep := seq(.N), by = .(id, episode)] 

#> help 
# id number episode number.ep 
# 1: 5  1  1   1 
# 2: 5  2  1   2 
# 3: 5  3  1   3 
# 4: 5  4  2   1 
# 5: 5  5  2   2 
# 6: 12  1  1   1 
# 7: 12  2  1   2 
# 8: 12  3  1   3 
# 9: 17  1  1   1 
#10: 17  2  1   2 
#11: 20  1  1   1 
#12: 20  2  1   2 
#13: 20  3  1   3 
#14: 20  4  2   1 
#15: 20  5  2   2 
#16: 20  6  3   1 
+1

是否有你的'seq'而不是'seq(.N)'/'seq(n())'的原因? – Frank

7

library(dplyr) 

help %>% group_by(id, episode) %>% 
     mutate(number.ep = row_number())