R:如何将'变量'的子集转换为data.table中的单独列?

时间:2015-02-27 16:00:57

标签: r casting data.table subset reshape2

我在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绿色数字获得,如下所示

enter image description here

示例代码:

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消失了,所以这对我的整体原因没有帮助。

2 个答案:

答案 0 :(得分:1)

以下是我使用akrun建议的dcast代码修改后的代码:

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.data.table(Long_DT[, N:=1:.N, variable], ID1+ID2+N~variable, subset = (variable=="Y.Measure") )

结果:

    ID1 ID2  N   Y.Measure
 1:   1   1  1 -0.62124058
 2:   1   1  7  0.82122120
 3:   1   2  4 -0.04493361
 4:   1   2 10  0.78213630
 5:   2   1  5 -0.01619026
 6:   2   1 11  0.07456498
 7:   2   2  2 -2.21469989
 8:   2   2  8  0.59390132
 9:   3   1  3  1.12493092
10:   3   1  9  0.91897737
11:   3   2  6  0.94383621
12:   3   2 12 -1.98935170

答案 1 :(得分:1)

我不确定这是否是您所期望的,但我只是将一个新功能推送到melt.data.table,现在允许融入多个列..

您可以按照these instructions安装开发版本。然后你可以这样做:

require(data.table) ## v1.9.5
melt(DT, id=1:2, measure=list(3:4, 5:6), 
       value.name = c("X.measure", "Y.measure"))

默认情况下,variable列会填充数字。如果这不合适,只需相应地更改变量列的级别。

HTH