首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R使用Reshape2进行重塑(stats包功能)的设计。

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

Stack Overflow用户
提问于 2014-07-12 06:02:49
回答 1查看 168关注 0票数 1

我试图做的正是什么重塑从统计软件包是设计的。我有一个广泛的数据集,其中包含了表单var_name.date中的一系列变量。不幸的是,reshape似乎还不能处理中等大小的数据集,所以我尝试使用data.table.melt函数。

我的主要问题是根据变量的长形式变量将变量分组为单独的值列。这是可能的吗?还是我需要分别处理每一个,然后再进行cbind呢?

以下是我所拥有的:

代码语言:javascript
复制
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,它用一行惊艳来嘲弄我,做我想做的事情,但没有缩放。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-12 06:47:27

这只是reshape()更容易使用的时候之一。

我认为,使用meltdcast.data.table组合的最直接方法如下:

代码语言:javascript
复制
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我的“劈叉形状”包,特别是开发版本。

代码语言:javascript
复制
# 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. 使用“不平衡”列组(其中一个组可能有两个度量值列,另一个组可能有三个)。

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

代码语言:javascript
复制
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))

另见:什么重塑问题可以一步就解决不了?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24710141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档