我正在处理一个要透视的大数据帧,这样列中的变量就变成了顶部的行。
我发现整形包在这种情况下非常有用,只是强制转换函数默认为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例。然后强制转换函数不知道如何聚合它们。
希望这能有所帮助。