2015-04-20 44 views

回答

5

您應該添加輔助ID列。從我的「splitstackshape」包中獲取getanID很容易。由於「splitstackshape」還加載「data.table」,很容易然後使用dcast.data.table轉換爲寬幅:

library(splitstackshape) 
dcast.data.table(
    getanID(mydf, "trans_id"), 
    trans_id ~ .id, value.var = "product_id") 
# trans_id 1 2 3 
# 1:  1 456 778 774 
# 2:  4 223 123 NA 
# 3:  5 999 NA NA 

相當於「dplyr」 +「tidyr」的做法是這樣的:

library(dplyr) 
library(tidyr) 

mydf %>% 
    group_by(trans_id) %>% 
    mutate(id = sequence(n())) %>% 
    spread(id, product_id) 
+0

真棒......完美的作品!謝謝! – Cybernetic

1

隨着tidyr

library(tidyr) 
t(df %>% spread(trans_id, product_id)) 

+1 @Ananda Mahto答案tidydplyr

+0

你能顯示你獲得的輸出嗎?我得到6列和3行。 – akrun

+0

小心發佈你得到的輸出。我得到了比預期更多的「NA」。 – A5C1D2H2I1M1N2O1R2T1

+0

我正在改進它 –

3

一個基礎R的選擇是

reshape(transform(df, N= ave(trans_id, trans_id, FUN=seq_along)), 
       idvar='trans_id', timevar='N', direction='wide') 
# trans_id product_id.1 product_id.2 product_id.3 
#1  1   456   778   774 
#2  4   223   123   NA 
#5  5   999   NA   NA 
相關問題