2016-08-01 41 views
2

我試圖像這樣的錶轉換:擴大柱

# A tibble: 10 x 2 
    user_id  pred 
    <int>  <fctr> 
1  27 electronics 
2  27  home 
3  38  health 
4  60 electronics 
5  60  beauty 
6  92  home 
7  92 electronics 
8  106  health 
9  117  home 
10  117  women 

一個看起來像這樣:

# A tibble: 6 x 3 
    user_id  pred_1  pred_2 
    <dbl>  <chr>  <chr> 
1  27 electronics  home 
2  38  health   NA 
3  60 electronics  beauty 
4  92  home electronics 
5  106  health   NA 
6  117  home  women 

即行每user_idpred列的擴展到pred_1,pred_2等任何想法?

UPDATE

最初的問題得到了解決。追問:

使用tidyr::spread方法,是有辦法帽group_sizeN,這樣,當蔓延,它需要在最N值各組?

+3

或者使用data.table'庫的開發人員版本(data.table); dcast(setDT(df),user_id〜rowid(user_id))' –

+0

謝謝大家,但我真的不知道這是如何重複的另一個問題。如果有的話,這是暴露'tidyr :: spread'的功能的更簡潔的方法 –

+0

這裏的解決方案是相同的。所有的解決方案都有幾十種類似的解決方案,其中很多都由同一用戶發佈。你可以檢查他們[這裏](http://stackoverflow.com/search?q=user%3A3732271+1%3A.N+dcast)和[這裏](http://stackoverflow.com/search?q =用戶%3A3732271 +行號+點差) –

回答

2

我們在'user_id'分組後創建一個序列列,然後spread從'long'到'wide'。

library(dplyr) 
library(tidyr) 
df1 %>% 
    group_by(user_id) %>% 
    mutate(id = paste0("pred_", row_number()), 
      id = factor(id, levels = unique(id))) %>% 
    spread(id, pred) 
# user_id  pred_1  pred_2 
#  <int>  <chr>  <chr> 
#1  27 electronics  home 
#2  38  health  <NA> 
#3  60 electronics  beauty 
#4  92  home electronics 
#5  106  health  <NA> 
#6  117  home  women 

或者我們可以使用dcastdata.table

library(data.table)#1.9.7+ 
dcast(setDT(df1), user_id~paste0("pred_", rowid(user_id)), value.var = "pred") 
+0

我遇到了(我認爲是)錯誤,其中'pred_'值不正確。例如:我的列的順序變爲'pred_1','pred_10','pred_11',...等等。 'pred_2'在第48欄 –

+0

@NickResnick我更新了dplyr/tidyr的帖子。請檢查它是否有幫助。 – akrun

+0

謝謝!你也可以回答更新的問題嗎?具體而言,您可以選擇創建的列數小於max_grouping嗎? –