data.table在多列上长到宽

Pet*_*hen 3 r data.table

我有一个关于data.table' meltdcast多列的问题.我在StackOverFlow上浏览过,但很多类似的帖子都不是我想要的.我将在下面解释.

首先,data是关于问题的原因和价值量.这是我的一部分data:

ID   Type    Problem1    Value1     Problem2    Value2    Problem3    Value3
1    A       X           500        Y           1000      Z           400
2    A       X           600        Z           700       
3    B       Y           700        Z           100
4    B       W           200        V           200
5    C       Z           500        V           500       
6    C       X           1000       W           100       V           900
Run Code Online (Sandbox Code Playgroud)

第二,ID是独一无二的.Type包含三个(A,B,和C).有5个问题.

ID == 1作为一个例子.这是Type A它包含3个问题(X,Y,和Z).它Problem XValue 500,Problem YValue 1000,Problem ZValue 400.以ID == 5作为一个例子.它Type C包含2个问题(ZV).它Problem ZValue 500Problem VValue 500.

第三,列ID,Type,Problem1,Problem2,和Problem3character.Value1,Value2Value3numeric.

结果我想要的是:

Type    X     Y     Z     W     V
A       1100  1000  1100  0     0   
B       0     700   100   200   200
C       1000  0     500   100   1400  
Run Code Online (Sandbox Code Playgroud)

我不知道如何正确解释.我想分组Type然后总结每个问题的版本.我认为这是长期的.我在这里这里找到了参考.第二个可能有用.但是,我不知道从哪里开始.有什么建议?

# data
dt <- fread("
ID   Type    Problem1    Value1     Problem2    Value2    Problem3    Value3
1    A       X           500        Y           1000      Z           400
2    A       X           600        Z           700       
3    B       Y           700        Z           100
4    B       W           200        V           200
5    C       Z           500        V           500       
6    C       X           1000       W           100       V           900", fill = T)    
Run Code Online (Sandbox Code Playgroud)

akr*_*run 8

我们可以先melt指定patternsin measure为'long'格式,然后dcast使用fun.aggregateassum

dcast(melt(dt, measure = patterns("^Value", "^Problem"), 
    value.name = c("Value", "Problem"))[Problem != ""
     ][, Problem := factor(Problem, levels = c("X", "Y", "Z", "W", "V"))], 
     Type ~Problem, value.var = "Value", sum, na.rm = TRUE)
#   Type    X    Y    Z   W    V
#1:    A 1100 1000 1100   0    0
#2:    B    0  700  100 200  200
#3:    C 1000    0  500 100 1400
Run Code Online (Sandbox Code Playgroud)

meltfrom data.table可以patternsmeasure论证中占多个.因此,当我们说它"^Value"匹配名称start(^)为"Value"的所有列时,类似于"Problem",并创建两个"value"列.在上面,我们将这些列命名为'Value'和'Problem'with value.nameargument.由于数据集有一些空白,长格式也有我们删除的空白元素Problem != "".如果我们需要按特定顺序排列列,则下一步非常重要.因此,我们将"问题"更改为factor类并按levels顺序指定.现在,melt部分已经完成.dcast通过指定公式,value.var列和fun.aggregate(此处sum),长格式现在更改为"宽"