R使用Reshape2进行重塑(统计包功能)的设计

时间:2014-07-12 06:02:49

标签: r data.table reshape2 melt

我试图完成从stats包中重塑的设计。我有一个包含var_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软件包reshape嘲笑我的一线真棒,完全符合我的要求而不是缩放。

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

1 个答案:

答案 0 :(得分:1)

这只是reshape()更易于使用的时间之一。

使用我能想到的meltdcast.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")

另一种方法是使用my "splitstackshape" package中的merged.stack,特别是开发版本。

# library(devtools)
# install_github("splitstackshape", "mrdwab", ref = "devel")
library(splitstackshape)

merged.stack(widetable, id.vars = "id", var.stubs = c("A", "B"), sep = "\\.")
#     id .time_1          A         B
#  1:  1 2012-10 0.26550866 0.2059746
#  2:  1 2012-11 0.89838968 0.4976992
#  3:  2 2012-10 0.37212390 0.1765568
#  4:  2 2012-11 0.94467527 0.7176185
#  5:  3 2012-10 0.57285336 0.6870228
#  6:  3 2012-11 0.66079779 0.9919061
#  7:  4 2012-10 0.90820779 0.3841037
#  8:  4 2012-11 0.62911404 0.3800352
#  9:  5 2012-10 0.20168193 0.7698414
# 10:  5 2012-11 0.06178627 0.7774452

merged.stack函数与简单melt的工作方式不同,因为它首先在list中“堆叠”不同的列组,然后将它们合并在一起。这允许函数:

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

  3. 此答案基于以下示例数据:

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

    另请参阅:What reshaping problems can melt/cast not solve in a single step?