【发布时间】:2015-02-27 16:00:57
【问题描述】:
我在 data table 中有一个大数据集,我正在尝试对其进行转换。原始数据集是一个交叉表,column_names 中有 1 到 2 级信息。所以我想我需要把所有东西都写下来melt,提取相关信息,然后将各个列重新投射回去。
这是我遇到障碍的地方。
下面是一个简化的模拟数据,显示了我正在尝试做的事情:
从:
ID1 ID2 X.Measure1 X.Measure2 Y.Measure1 Y.Measure2
1: 1 1 -0.6264538 0.4874291 -0.62124058 0.82122120
2: 2 2 0.1836433 0.7383247 -2.21469989 0.59390132
3: 3 1 -0.8356286 0.5757814 1.12493092 0.91897737
4: 1 2 1.5952808 -0.3053884 -0.04493361 0.78213630
5: 2 1 0.3295078 1.5117812 -0.01619026 0.07456498
6: 3 2 -0.8204684 0.3898432 0.94383621 -1.98935170
执行 2 个中间步骤: (i) 将整数“1”和“2”提取到新列“n”中; (ii) 将“变量”重命名为“Y.Measure”(如下左图所示)。
最终的表格由casting得到如下图右边的绿色数字:
示例代码:
library( data.table )
library( reshape2 )
library( stringr )
set.seed(1)
DT <- data.table( ID1 = rep( c(1:3),2 ), ID2 = rep( c(1:2),3 ),
X.Measure1 = rnorm(6), X.Measure2 = rnorm(6),
Y.Measure1 = rnorm(6), Y.Measure2 = rnorm(6)
)
Long_DT <- melt( DT, id = c( "ID1", "ID2" ) )
Long_DT[ , n := substr( Long_DT$variable, 10, 10 ) ]
Long_DT[ str_detect( Long_DT$variable, "Y.Measure." ), variable := "Y.Measure" ]
问题:
但是当我尝试 dcast 与 subset 参数时,我得到了错误的结果:
> dcast.data.table ( Long_DT, ID1+ID2 ~ variable, subset = (variable=="Y.Measure") )
Aggregate function missing, defaulting to 'length'
ID1 ID2 Y.Measure
1: 1 1 2
2: 1 2 2
3: 2 1 2
4: 2 2 2
5: 3 1 2
6: 3 2 2
我尝试在谷歌上搜索解决方案,但无济于事。我想知道我的 dcast 函数是否错误,或者我的方法一开始就错误(即有一种更简单的方法可以实现我想要的)。
任何帮助将不胜感激!感谢阅读!
更新:
我在上面的 dcast 函数中发现了错误 - LHS 上应该有“n”:
dcast.data.table ( Long_DT, ID1+ID2+n ~ variable, subset = .(variable=="Y.Measure") )
结果是:
> dcast.data.table ( Long_DT, ID1+ID2+n ~ variable, subset = .(variable=="Y.Measure") )
ID1 ID2 n Y.Measure
1: 1 1 1 -0.62124058
2: 1 1 2 0.82122120
3: 1 2 1 -0.04493361
4: 1 2 2 0.78213630
5: 2 1 1 -0.01619026
6: 2 1 2 0.07456498
7: 2 2 1 -2.21469989
8: 2 2 2 0.59390132
9: 3 1 1 1.12493092
10: 3 1 2 0.91897737
11: 3 2 1 0.94383621
12: 3 2 2 -1.98935170
>
不幸的是,XMeasure1 和 XMeasure2 也与 subset 一起消失了,所以这对我的整体事业没有帮助。
【问题讨论】:
-
试试
dcast.data.table(Long_DT[, N:=1:.N, variable], ID1+ID2+N~variable, subset = (variable=="Y.Measure") ) -
如果你需要excel图中的结果,为什么不只是子集而不是
dcast -
嗨@akrun,我试过你的代码,但结果似乎错误。为响应您对子集的建议,
dcast是重新格式化数据以导入另一个分析软件的多步骤过程的一部分。你看,原始数据集是一个交叉表,column_names 中有 1 到 2 级信息。所以我想我需要把melt一切都记下来,提取相关信息,然后将各个列重新投射回去。我想我也应该提到我对数据操作缺乏经验,所以我愿意接受建议。 -
我的意思是在
melt步骤之后。您应该指定错误的部分。我在看你的excel图。dcast结果似乎和那个一样。 -
我尝试使用您的
dcast代替我原来的 dcast,将结果作为答案放在下面。
标签: r casting data.table subset reshape2