R使用整形2完成整形(统计数据包函数)的设计目的

R使用整形2完成整形(统计数据包函数)的设计目的,r,data.table,reshape2,melt,R,Data.table,Reshape2,Melt,我正试图做什么重塑从统计数据包是专为。我有一个广泛的数据集,其中包含一系列变量,格式为var\u name.date。不幸的是,即使是中等大小的数据集,重塑似乎也无法处理,所以我尝试使用data.table.melt函数 我的主要问题是根据变量的长格式将变量分组到单独的值列中。这是可能的,还是我需要分别完成每一项,然后cbind 以下是我所拥有的: widetable = data.table("id"=1:5,"A.2012-10"=runif(5),"A.2012-11"=runif(5),

我正试图做什么重塑从统计数据包是专为。我有一个广泛的数据集,其中包含一系列变量,格式为
var\u name.date
。不幸的是,即使是中等大小的数据集,重塑似乎也无法处理,所以我尝试使用
data.table.melt
函数

我的主要问题是根据变量的长格式将变量分组到单独的值列中。这是可能的,还是我需要分别完成每一项,然后
cbind

以下是我所拥有的:

widetable = data.table("id"=1:5,"A.2012-10"=runif(5),"A.2012-11"=runif(5),
                       "B.2012-10"=runif(5),"B.2012-11"=runif(5))


   id  A.2012-10 A.2012-11  B.2012-10 B.2012-11
1:  1 0.82982349 0.2257782 0.46390924 0.4448248
2:  2 0.46136746 0.2184797 0.05640388 0.4772663
3:  3 0.61723234 0.3950625 0.03252784 0.4006974
4:  4 0.19963437 0.7028052 0.06811452 0.3096969
5:  5 0.09575389 0.5510507 0.76059610 0.8630222
以下是
stats
软件包的
reforme
用一行令人敬畏的代码来嘲弄我,这正是我想要的,但不是缩放

reshape(widetable, idvar="id", varying=colnames(widetable)[2:5],
        sep=".", direction="long")


    id  time          A          B
 1:  1 2012-10 0.82982349 0.46390924
 2:  2 2012-10 0.46136746 0.05640388
 3:  3 2012-10 0.61723234 0.03252784
 4:  4 2012-10 0.19963437 0.06811452
 5:  5 2012-10 0.09575389 0.76059610
 6:  1 2012-11 0.22577823 0.44482478
 7:  2 2012-11 0.21847969 0.47726629
 8:  3 2012-11 0.39506249 0.40069737
 9:  4 2012-11 0.70280519 0.30969695
10:  5 2012-11 0.55105075 0.86302220

这只是
重塑()
更容易使用的时候之一

我能想到的结合使用
melt
dcast.data.table
的最直接方法如下:

library(data.table)
library(reshape2)

longtable <- melt(widetable, id.vars = "id")
vars <- do.call(rbind, strsplit(as.character(longtable$variable), ".", TRUE))
dcast.data.table(longtable[, c("V1", "V2") := lapply(1:2, function(x) vars[, x])],
                 id + V2 ~ V1, value.var = "value")
merged.stack
函数的工作原理与简单的
melt
不同,因为它首先在
列表中“堆叠”不同的列组,然后将它们合并在一起。这允许该功能:

  • 使用列组,其中每个列组可能具有不同的类型(字符、数字等)
  • 使用“不平衡”列组(其中一个组可能有两个度量值列,另一个组可能有三个度量值列)

  • 此答案基于以下样本数据:

    set.seed(1) # Please use `set.seed()` when sharing an example with random numbers
    widetable = data.table("id"=1:5,"A.2012-10"=runif(5),"A.2012-11"=runif(5),
                           "B.2012-10"=runif(5),"B.2012-11"=runif(5))
    


    另请参见:

    感谢您的回复,并确认我想要的东西不能像使用melt那样简单地完成,也不能像使用melt那样简单地完成。我一直在尝试使用merge.stack处理您的包,但我想我不得不放弃零碎地处理它。作为参考,该表有~150k行(ID)和555个变量——38*14个时间段+一些与时间无关的其他时间段。大约450mb,我使用的是8GB RAM和8GB虚拟内存,但您的
    merge.stack
    restrape
    都超过了我的内存容量。@用户3747260,只是好奇:如果您将数据加载为“data.table”,那么
    tables()
    报告的大小是多少?
    set.seed(1) # Please use `set.seed()` when sharing an example with random numbers
    widetable = data.table("id"=1:5,"A.2012-10"=runif(5),"A.2012-11"=runif(5),
                           "B.2012-10"=runif(5),"B.2012-11"=runif(5))