根据另一列的分组扩展列 (dplyr/tidyr)

Expanding column based on another column's grouping (dplyr/tidyr)

我正在尝试像这样转换 table:

# 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_id 一行,并将 pred 列扩展为 pred_1pred_2 等。有什么想法吗?

更新

最初的问题已解决。跟进:

使用 tidyr::spread 方法,有没有一种方法可以将 group_size 限制为 N 以便在传播时,它最多需要每个 N 值组?

我们在按 '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

或者我们可以使用 data.table

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