基于另一列展开列';s分组(dplyr/tidyr)

基于另一列展开列';s分组(dplyr/tidyr),r,dplyr,reshape2,tidyr,R,Dplyr,Reshape2,Tidyr,我正在尝试转换如下表: # 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

我正在尝试转换如下表:

# 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
#一个tible:10x2
用户id pred
1 27电子设备
2727家
3 38健康
460电子产品
560美女
692家
792电子产品
8 106健康
9117家
10117名妇女
对于一个看起来像这样的人:

# 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
#一个tible:6 x 3
用户id pred_1 pred_2
1 27电子家居
2 38卫生署
360电子美容
492家用电器
5 106卫生署
6117名家庭妇女
i、 e.每个
用户id
一行,并将
pred
列扩展为
pred\u 1
pred\u 2
等。有什么想法吗

更新

最初的问题解决了。后续行动:


使用
tidyr::spread
方法,是否有一种方法将
group\u size
限制为
N
,这样在进行传播时,每个组最多只需要
N
个值?

我们在按“用户id”分组后创建一个序列列,然后将
spread
从“长”改为“宽”

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

或者使用data.table
库(data.table)的devel版本;dcast(setDT(df),user_id~rowid(user_id))
谢谢大家,但我并不认为这是另一个问题的重复。如果说有什么区别的话,这是一种更简洁的方式来公开
tidyr::spread
的功能解决方案是相同的。现在世界各地都有几十种类似的解决方案,其中许多都是由同一个用户发布的。您可以检查其中一些,然后确定。我有一个更新的问题(以及一个单独的问题,答案如下所述)。我遇到了一个错误,
pred\uu
值不符合顺序。例如:我的列的顺序是
pred_1
pred_10
pred_11
。。。等等
pred_2
在列中48@NickResnick我更新了dplyr/tidyr的帖子。请检查是否有帮助。谢谢!你能回答更新后的问题吗?具体来说,你能选择它创建的列数小于
max\u grouping
?@NickResnick你能把它作为一个新问题发布吗?因为这个问题被重复了,看起来是个有趣的问题。我刚刚问过。另外,这里还有一个错误,相同的
用户id
出现在多行中,每行中只有部分
pred