如何使用reshape r“还原”数据

18

我有一个使用reshape包melt后的数据框,我想要"un melt"

这里有一个融合后数据的玩具示例(真实数据框的大小为500x100或更大):

variable<-c(rep("X1",3),rep("X2",3),rep("X3",3))
value<-c(rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3))
dat <-data.frame(variable,value)
dat
 variable     value
1       X1 0.5285376
2       X1 0.5285376
3       X1 0.5285376
4       X2 0.1694908
5       X2 0.1694908
6       X2 0.1694908
7       X3 0.7446906
8       X3 0.7446906
9       X3 0.7446906

每个变量(X1,X2,X3)在三个不同的时间点上有不同的值(在这个示例中恰好相同,但实际情况从未发生过)。

我希望将其以以下形式呈现:

     X1        X2        X3
1 0.5285376 0.1694908 0.7446906
2 0.5285376 0.1694908 0.7446906
3 0.5285376 0.1694908 0.7446906

基本上,我希望变量列按ID (X1、X2等)排序并成为列标题。我尝试了各种排列组合的 cast、dcast、recast 等方法,但似乎无法得到所需的数据格式。将数据从宽格式转换为长格式(例如 dat 数据集)很容易,但是却很难恢复原样。有什么想法吗?我知道这相对简单,但我很难概念化如何在 reshape 或 reshape2 中完成。

谢谢, LP


这里有点棘手,因为在你的融合数据中,你已经丢失了它最初所在的行信息,也就是在哪个时间估计的。如果你愿意假设它总是按顺序1-2-3(如果只有两个,则为1-2)进行的,那么你可以创建一个带有该信息的行,然后将其转换回去。 - Aaron left Stack Overflow
2个回答

24

我通常通过创建一个ID列,然后使用 dcast 函数来实现:

> dat
  variable     value
1       X1 0.4299397
2       X1 0.4299397
3       X1 0.4299397
4       X2 0.2531551
5       X2 0.2531551
6       X2 0.2531551
7       X3 0.3972119
8       X3 0.3972119
9       X3 0.3972119
> dat$id <- rep(1:3,times = 3)
> dcast(data = dat,formula = id~variable,fun.aggregate = sum,value.var = "value")
  id        X1        X2        X3
1  1 0.4299397 0.2531551 0.3972119
2  2 0.4299397 0.2531551 0.3972119
3  3 0.4299397 0.2531551 0.3972119

2
由于他们提到的值的数量可能不一致,因此您可以考虑将 dat$id 更改为类似 with(dat, ave(rep(1, nrow(dat)), variable, FUN = seq_along)) 的东西。 - A5C1D2H2I1M1N2O1R2T1
啊,谢谢。我漏掉了ID。这对于这个通过模拟生成的特定数据集非常有效。 - LP_640

1

根据您需要的健壮程度,以下代码可以正确地转换变量出现的次数(且顺序无关)。

> variable<-c(rep("X1",5),rep("X2",4),rep("X3",3))
> value<-c(rep(rnorm(1,.5,.2),5),rep(rnorm(1,.5,.2),4),rep(rnorm(1,.5,.2),3))
> dat <-data.frame(variable,value)
> dat <- dat[order(rnorm(nrow(dat))),]
> dat
   variable     value
11       X3 1.0294454
8        X2 0.6147509
2        X1 0.3537012
7        X2 0.6147509
9        X2 0.6147509
5        X1 0.3537012
4        X1 0.3537012
12       X3 1.0294454
3        X1 0.3537012
1        X1 0.3537012
10       X3 1.0294454
6        X2 0.6147509
> dat$id = numeric(nrow(dat))
> for (i in 1:nrow(dat)){
+   dat_temp <- dat[1:i,]
+   dat[i,]$id <- nrow(dat_temp[dat_temp$variable == dat[i,]$variable,])
+ }
> cast(dat, id~variable, value = 'value')
  id        X1        X2       X3
1  1 0.3537012 0.6147509 1.029445
2  2 0.3537012 0.6147509 1.029445
3  3 0.3537012 0.6147509 1.029445
4  4 0.3537012 0.6147509       NA
5  5 0.3537012        NA       NA

对于id,您需要使用rep(1:nrow(dat)) - Workhorse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接