在R中使用具有不均匀长度的变量的熔体/铸造

时间:2011-06-17 20:31:36

标签: r casting reshape melt

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

我发现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,它不保留原始值。

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

3 个答案:

答案 0 :(得分:5)

只需在cast调用中包含所有变量即可。重塑期望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

答案 1 :(得分: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)

答案 2 :(得分:0)

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

希望这有帮助。