我有一个关于data.table' melt和dcast多列的问题.我在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 X有Value 500,Problem Y有Value 1000,Problem Z有Value 400.以ID == 5作为一个例子.它Type C包含2个问题(Z和V).它Problem Z有Value 500和Problem V有Value 500.
第三,列ID,Type,Problem1,Problem2,和Problem3是character.Value1,Value2和Value3是numeric.
结果我想要的是:
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)
我们可以先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可以patterns在measure论证中占多个.因此,当我们说它"^Value"匹配名称start(^)为"Value"的所有列时,类似于"Problem",并创建两个"value"列.在上面,我们将这些列命名为'Value'和'Problem'with value.nameargument.由于数据集有一些空白,长格式也有我们删除的空白元素Problem != "".如果我们需要按特定顺序排列列,则下一步非常重要.因此,我们将"问题"更改为factor类并按levels顺序指定.现在,melt部分已经完成.dcast通过指定公式,value.var列和fun.aggregate(此处sum),长格式现在更改为"宽"