2015-06-05 81 views
2

我有一些看起來像這樣的數據。我想通過電子郵件和wk_id分配一個「ID」。根據兩列分配ID R

row_num email wk_id 
    1  aaaa 1/4/15 
    2  aaaa 1/11/15 
    3  aaaa 1/25/15 
    4  bbbb 6/29/14 
    5  bbbb 9/7/14 
    6  cccc 11/16/14 
    7  cccc 11/30/14 
    8  cccc 12/7/14 
    9  cccc 12/14/14 
    10  cccc 12/21/14 
    11  cccc 12/28/14 
    12  cccc 1/4/15 
    13  cccc 1/25/15 

我希望數據看起來像這樣。

row_num email wk_id  ID 
1  aaaa 1/4/15  1 
2  aaaa 1/11/15  2 
3  aaaa 1/25/15  3 
4  bbbb 6/29/14  1 
5  bbbb 9/7/14  2 
6  cccc 11/16/14 1 
7  cccc 11/30/14 2 
8  cccc 12/7/14  3 
9  cccc 12/14/14 4 
10  cccc 12/21/14 5 
11  cccc 12/28/14 6 
12  cccc 1/4/15  7 
13  cccc 1/25/15  8 

我不知道如何讓「計數器」在每次遇到新的電子郵件地址時進行重置。我試過data.tableddply,但仍然無法完全掌握它。

+0

使用哈德利法...分割應用合併。通過電子郵件/ wk_id拆分數據,apply:爲每個塊添加1:nrow(small_chunk)列,然後合併回數據框。 – cory

回答

3

你可以嘗試:

library(dplyr) 
df %>% 
    group_by(email) %>% 
    mutate(ID = row_number()) 

其中給出:

#Source: local data frame [13 x 4] 
#Groups: email 
# 
# row_num email wk_id ID 
#1  1 aaaa 1/4/15 1 
#2  2 aaaa 1/11/15 2 
#3  3 aaaa 1/25/15 3 
#4  4 bbbb 6/29/14 1 
#5  5 bbbb 9/7/14 2 
#6  6 cccc 11/16/14 1 
#7  7 cccc 11/30/14 2 
#8  8 cccc 12/7/14 3 
#9  9 cccc 12/14/14 4 
#10  10 cccc 12/21/14 5 
#11  11 cccc 12/28/14 6 
#12  12 cccc 1/4/15 7 
#13  13 cccc 1/25/15 8 

或者使用data.table

library(data.table) 
setDT(df)[, ID:= 1:.N, email] 

或者avebase R

df$ID <- with(df, ave(row_num, email, FUN=seq_along))