如何规范化R中数据表中的多值列

Leo*_*ssi 1 r apply plyr data.table

我有一个data.table如下:

order   products    value
1000    A|B 10
2000    B|C 20
3000    A|C 30
4000    B|C|D   5
5000    C|D 15
Run Code Online (Sandbox Code Playgroud)

我需要打破列产品并转换/规范化以便像这样使用:

order   prod.seq    prod.name   value
1000    1   A   10
1000    2   B   10
2000    1   B   20
2000    2   C   20
3000    1   A   30
3000    2   C   30
4000    1   B   5
4000    2   C   5
4000    3   D   5
5000    1   C   15
5000    2   D   15
Run Code Online (Sandbox Code Playgroud)

我想我可以使用自定义FOR/LOOP来实现它,但我想知道使用apply,ddply方法更高级的方法.有什么建议?

Fra*_*ank 5

首先,转换为字符/字符串:

DT[,products:=as.character(products)]
Run Code Online (Sandbox Code Playgroud)

然后你可以拆分字符串:

DT[,{
  x = strsplit(products,"\\|")[[1]]
  list( prod.seq = seq_along(x), prod_name = x )
}, by=.(order,value)]
Run Code Online (Sandbox Code Playgroud)

这使

    order value prod.seq prod_name
 1:  1000    10        1         A
 2:  1000    10        2         B
 3:  2000    20        1         B
 4:  2000    20        2         C
 5:  3000    30        1         A
 6:  3000    30        2         C
 7:  4000     5        1         B
 8:  4000     5        2         C
 9:  4000     5        3         D
10:  5000    15        1         C
11:  5000    15        2         D
Run Code Online (Sandbox Code Playgroud)