2013-02-20 52 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

相關問題