4

我正在使用一个要旋转的大型数据框,以便列中的变量成为顶部的行。

我发现 reshape 包在这种情况下非常有用,除了 cast 函数默认为 fun.aggregate=length。大概这是因为我按“案例”执行这些操作,并且测量的变量数量因案例而异。

我想旋转,以便在旋转的数据框中将缺失的变量表示为“NA”。

所以,换句话说,我想从一个像这样的熔融数据框开始:

Case | Variable | Value
 1         1        2.3
 1         2        2.1
 1         3        1.3
 2         1        4.3
 2         2        2.5
 3         1        1.8
 3         2        1.9
 3         3        2.3
 3         4        2.2

对于这样的事情:

Case | Variable 1 | Variable 2 | Variable 3 | Variable 4
 1         2.3          2.1          1.3         NA
 2         4.3          2.5          NA          NA
 3         1.8          1.9          2.3         2.2 

代码 dcast(data,...~Variable) 再次默认为 fun.aggregate=length,它不保留原始值。

感谢您的帮助,如果有任何不清楚的地方,请告诉我!

4

3 回答 3

5

只需在cast调用中包含所有变量即可。Reshape 期望该Value列被调用value,因此它会引发警告,但仍然可以正常工作。它使用的原因fun.aggregate=length是因为公式中缺少Case。它聚合了Case.

尝试:cast(data, Case~Variable)

data <- data.frame(Case=c(1,1,1,2,2,3,3,3,3),
  Variable=c(1,2,3,1,2,1,2,3,4),
  Value=c(2.3,2.1,1.3,4.3,2.5,1.8,1.9,2.3,2.2))

cast(data,Case~Variable)
Using Value as value column.  Use the value argument to cast to override this choice
  Case   1   2   3   4
1    1 2.3 2.1 1.3  NA
2    2 4.3 2.5  NA  NA
3    3 1.8 1.9 2.3 2.2

编辑:作为对@Jon 评论的回应。如果数据框中还有一个变量,你会怎么做?

data <- data.frame(expt=c(1,1,1,1,2,2,2,2,2),
               func=c(1,1,1,2,2,3,3,3,3),
               variable=c(1,2,3,1,2,1,2,3,4),
               value=c(2.3,2.1,1.3,4.3,2.5,1.8,1.9,2.3,2.2))

cast(data,expt+variable~func)
  expt variable   1   2   3
1    1        1 2.3 4.3  NA
2    1        2 2.1  NA  NA
3    1        3 1.3  NA  NA
4    2        1  NA  NA 1.8
5    2        2  NA 2.5 1.9
6    2        3  NA  NA 2.3
7    2        4  NA  NA 2.2
于 2011-06-17T21:17:51.513 回答
0

为避免警告消息,您可以根据另一个变量对数据框进行子集化,即具有三个级别 a、b、c 的分类变量。因为在您当前的 a 类数据中,它有 70 个案例,对于 b 80 个案例,c 有 90 个案例。然后 cast 函数不知道如何聚合它们。

希望这可以帮助。

于 2013-11-27T11:56:05.183 回答
0

这是一种解决方案。它不使用您提到的包或功能,但它可能有用。假设您的数据框被称为df

M <- matrix(NA,
            nrow = length(unique(df$Case)),
            ncol = length(unique(df$Variable))+1,
            dimnames = list(NULL,c('Case',paste('Variable',sort(unique(df$Variable))))))
irow <- match(df$Case,unique(df$Case))
icol <- match(df$Variable,unique(df$Variable)) + 1
ientry <- irow + (icol-1)*nrow(M)
M[ientry] <- df$Value
M[,1] <- unique(df$Case)
于 2011-06-17T20:59:37.463 回答