2016-08-01 34 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吗? –