2013-02-20 55 views
0

ROW_NUMBER()OVER(PARTITION由尼克ORDER BY p_time)中的R

x=data.frame(nick=c('a','a','b','b','b','c'), p_time=1:6) 
    nick p_time 
1 a  1 
2 a  2 
3 b  3 
4 b  4 
5 b  5 
6 c  6 

我怎样才能得到这样的:

nick p_time flag 
1 a  1 1 
2 a  2 2 
3 b  3 1 
4 b  4 2 
5 b  5 3 
6 c  6 1 

我用的pgsql ROW_NUMBER() OVER (PARTITION BY nick ORDER BY p_time)得到它,但现在需要仅使用R。 谢谢。

回答

0

看起来你只是想生成各种各样的团体,你的群体是“缺口”栏的“序列号”。如果是这样的话,你可以只使用aveseq_alongwithin

within(x, { 
    flag <- ave(as.character(nick), nick, FUN = seq_along) 
}) 
# nick p_time flag 
# 1 a  1 1 
# 2 a  2 2 
# 3 b  3 1 
# 4 b  4 2 
# 5 b  5 3 
# 6 c  6 1 
+0

AVE + seq_along是我需要的 – funnng 2013-02-20 09:38:43

+0

请注意'ORDER BY p_time'部分。 – BenBarnes 2013-02-20 10:49:35

+0

是的,这是样本数据,在生成常规序列之前,我已经完成了'x [order(nick,p_time)]' – funnng 2013-02-20 11:21:14

0

试试这个

x$flag<-as.vector(unlist(tapply(x$p_time,x$nick,FUN=function(x){1:length(x)}))); 
+0

它完美 – funnng 2013-02-20 09:36:28

1

尝试dplyr :: ROW_NUMBER()函数

x %>% 
    group_by(nick) %>% 
    mutate(flag = row_number()) 

# A tibble: 6 x 3 
# Groups: nick [3] 
    nick p_time flag 
    <fct> <int> <int> 
1 a   1  1 
2 a   2  2 
3 b   3  1 
4 b   4  2 
5 b   5  3 
6 c   6  1 

更多信息here

相关问题