如何使用 reshape r “解开”数据

Posted

技术标签:

【中文标题】如何使用 reshape r “解开”数据【英文标题】:How to "unmelt" data with reshape r 【发布时间】:2014-11-14 03:41:48 【问题描述】:

我有一个使用 reshape 包融化的数据框,我想“解开”。

这是一个融合数据的玩具示例(实际数据帧为 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) 都有在 3 个不同时间估计的值(在这个玩具示例中碰巧是相同的,但情况并非如此)。

我想以以下形式(返回):

     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 中做到这一点。

谢谢, 唱片

【问题讨论】:

这里有点棘手,因为在您融化的数据中,您已经丢失了有关它最初位于哪一行的信息,即估计的三倍中的哪一倍。如果您愿意假设它始终按顺序排列为 1-2-3(如果只有两个,则为 1-2),您可以使用该信息排成一行,然后再将其放回。 【参考方案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))【参考方案2】:

我通常通过创建一个 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

【讨论】:

当他们提到值的数量可能不一致时,不妨考虑将您的 dat$id 更改为 with(dat, ave(rep(1, nrow(dat)), variable, FUN = seq_along)) 之类的东西。 啊,谢谢。我错过了身份证。这适用于通过模拟生成的特定数据集。

以上是关于如何使用 reshape r “解开”数据的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用reshape函数将dataframe数据从长表变换为宽表(long format to wide format)

R语言使用reshape包的rename函数修改数据变量的名称例如使用rename函数自定义修改dataframe数据列的名称

如何使用httpCanary解开防沉迷

如何重命名 R 对象?

numpy的ndarray数组如何reshape成固定大小

R:reshape2 long to wide 用 1 到 3 之间的整数替换实数值