R中序列数据的数据转换:基于其他列连接一列的数据

data transformation for sequence data in R: concatenating data of one column based other columns

我有一个数据框,其中包含关于会话号的一长串顺序操作。我想在给定会话和 user_id 的一行中连接所有顺序操作。 假设我有:

DF:
user_id  session action
1000         1    A
1000         1    B
1000         1    C
1000         2    A
1000         2    B
1001         1    A
1001         1    D
1001         2    B
1001         3    C
1002         1    B
1002         1    D
1002         1    D

我想转换成这种格式:

new_DF:

user_id  session action1 action2 action3
1000       1       A      B       C
1000       2       A      B       NA
1001       1       A      D       NA
1001       2       B      NA      NA
1001       3       C      NA      NA
1002       1       B      D       D

new_DF中的列数等于单个会话中的最大操作数。操作较少的用户会收到 NA 会话中的无效操作。
我怎样才能在 R 中做到这一点?

这是tidyverse解决方案:

library(tidyverse);
df %>%
    group_by(user_id, session) %>%
    mutate(n = paste0("action", 1:n())) %>%
    spread(n, action)
## A tibble: 6 x 5
## Groups:   user_id, session [6]
#  user_id session action1 action2 action3
#    <int>   <int> <fct>   <fct>   <fct>
#1    1000       1 A       B       C
#2    1000       2 A       B       NA
#3    1001       1 A       D       NA
#4    1001       2 B       NA      NA
#5    1001       3 C       NA      NA
#6    1002       1 B       D       D

我们按 user_idsession 分组,然后对每组内的行进行编号,spread 到宽。

我们可以使用 dcast 来自 data.table

library(data.table)
dcast(setDT(DF), user_id + session ~ 
      paste0("action", rowid(user_id, session)), value.var = "action")
#      user_id session action1 action2 action3
#1:    1000       1       A       B       C
#2:    1000       2       A       B      NA
#3:    1001       1       A       D      NA
#4:    1001       2       B      NA      NA
#5:    1001       3       C      NA      NA
#6:    1002       1       B       D       D