使用R中长度不均匀变量的熔体/铸件



我正在处理一个要透视的大数据帧,这样列中的变量就变成了顶部的行。

我发现整形包在这种情况下非常有用,只是强制转换函数默认为fun.gaggregate=length。这可能是因为我按"case"执行这些操作,并且测量的变量数量因情况而异。

我想进行数据透视,以便在数据透视的数据帧中将丢失的变量表示为"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.agregate=长度,不保留原始值。

谢谢你的帮助,如果有什么不清楚的地方请告诉我!

这只是在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

这里有一个解决方案。它没有使用你提到的包或功能,但它可能有用。假设您的数据帧称为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)

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

希望这能有所帮助。

最新更新