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_id
和 session
分组,然后对每组内的行进行编号,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
我有一个数据框,其中包含关于会话号的一长串顺序操作。我想在给定会话和 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_id
和 session
分组,然后对每组内的行进行编号,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