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))