2016-05-03 35 views
1

我確信這必須是一個愚蠢的但我不能得到它的工作。我想添加一個ID col到一個數據框,爲一列中的每個唯一值重置爲1。描述最好的方法是通過例如:在R中重置爲1的組編號爲

gr1 <- c("A","A","A","B","B","B") 
gr2 <- c(1,1,2,3,4,4) 

df <- data.frame(gr1, gr2) 

希望的輸出:

id <- c(1,1,2,1,2,2) 
df <- cbind(df, id) 

的ID被標記GR1的每個子集內的GR2唯一值。當gr1從A更改爲B時,ID重置爲1.我已閱讀(Assign an ID based on two columns R),但這不是我想要的。我不想添加排名功能(我認爲),因爲我希望我的領帶在gr1中都具有相同的ID,例如

df2 <- df %>% group_by(gr1) %>% mutate(id=rank(gr2, ties.method="max")) 

把我的頭撞在牆上。任何指針都會有很大的幫助。

+1

使用'data.table':'setDT(DF)[,ID:= RLEID(GR2),GR1]' – mtoto

+0

這完美地工作。你想發佈作爲答案嗎? – Pete900

+0

'1 + gr2 - ave(gr2,gr1,FUN = min)' – rawr

回答

4

我們可以使用?rleiddata.table包。

library(data.table) 
setDT(df)[, id := rleid(gr2), by = gr1] 
> df 
    gr1 gr2 id 
1: A 1 1 
2: A 1 1 
3: A 2 2 
4: B 3 1 
5: B 4 2 
6: B 4 2 
4

試試這個,它使用ave進行分組和factor從1.注意ave自動由於GR2是數字,它使結果一致的因素轉換回數字重新分配順序的水平。沒有包被使用。

df2 <- transform(df, gr2 = ave(gr2, gr1, FUN = factor)) 

,並提供:

> df2 
    gr1 gr2 
1 A 1 
2 A 1 
3 A 2 
4 B 1 
5 B 2 
6 B 2 

它返回的因素和數字列的數據幀:

> str(df2) 
'data.frame': 6 obs. of 2 variables: 
$ gr1: Factor w/ 2 levels "A","B": 1 1 1 2 2 2 
$ gr2: num 1 1 2 1 2 2 
+0

只是在我的真實數據集上試試這個。它似乎返回了這個因子本身,而不是一個id。我會嘗試發佈一些真實的數據。 – Pete900

+0

不在問題中提供的數據。也許你的數據框有一個因素爲gr2而不是數字。如果是這樣,請先將其轉換爲數字,以便它與發佈內容相對應。 –

+0

是的你是對的。也謝謝你。 – Pete900

3

這裏是一個dplyr解決

df %>% 
    group_by(gr1) %>% 
    mutate(id=as.numeric(factor(gr2))) 
+0

這也工作得很好,謝謝。 – Pete900