【发布时间】:2019-06-16 07:56:57
【问题描述】:
我有以下数据集:
structure(list(ID = c(5L, 6L, 7L, 8L, 10L), chain = c("x49",
"x43", "x32 > x42 > x49 > x45 > x20 > x50 > x38", "x54 > x44",
"x38 > x38")), row.names = c(NA, -5L), class = c("data.table",
"data.frame"))
ID chain
1: 5 x49
2: 6 x43
3: 7 x32 > x42 > x49 > x45 > x20 > x50 > x38
4: 8 x54 > x44
5: 10 x38 > x38
链列代表产品的购买过程,也缺少一些信息(start和buy)。目标是将链中的每个值计算两次(origin,例如 from 和 destination,例如 to)能够做到这一点,我需要重组数据集。
例如,重组后的链 x54 > x44 应该是这样的:
from to
1 start x54
2 x54 x44
3 x44 buy
整个结果应该是这样的:
from to
1 start x49
2 x49 buy
3 start x43
4 x43 buy
5 start x32
6 x32 x42
7 x42 x49
8 x49 x45
9 x45 x20
10 x20 x50
11 x38 buy
12 start x54
13 x54 x44
14 x44 buy
15 start x54
16 x54 x44
17 x44 buy
18 start x38
19 x38 x38
20 x38 buy
我已经尝试过了,但我不确定这是否是一个好主意(我也不知道如何在这里继续)。
df <- strsplit(df$chain, ">")
lapply(df, trimws)
性能可能很重要,因为链可能会变得很长(30 个项目)并且整个数据集有 10 万行。
【问题讨论】:
-
因为您已经有一个
data.table并且写到性能可能是一个问题,请在此处查看data.table替代方案:Split comma-separated strings in a column into separate rows。d[ , {x <- unlist(tstrsplit(chain, " > ")); .(from = c("start", x), to = c(x, "buy"))}, ID]