R 必须先“融化”一个数据帧,然后再“转换”它吗?
必须一个R 必须先“融化”一个数据帧,然后再“转换”它吗?,r,dataframe,reshape2,R,Dataframe,Reshape2,必须一个熔化一个数据帧才能进行铸造?从?熔化: data molten data frame, see melt. 换句话说,在进行任何acast或dcast操作之前,是否绝对有必要熔化数据帧 考虑以下几点: library("reshape2") library("MASS") xb <- dcast(Cars93, Manufacturer ~ Type, mean, value.var="Price") m.Cars93 <- melt(Cars93, id.vars
熔化
一个数据帧才能进行铸造?从?熔化:
data molten data frame, see melt.
换句话说,在进行任何acast
或dcast
操作之前,是否绝对有必要熔化数据帧
考虑以下几点:
library("reshape2")
library("MASS")
xb <- dcast(Cars93, Manufacturer ~ Type, mean, value.var="Price")
m.Cars93 <- melt(Cars93, id.vars=c("Manufacturer", "Type"), measure.vars="Price")
xc <- dcast(m.Cars93, Manufacturer ~ Type, mean, value.var="value")
因此在这种情况下,melt
操作似乎是多余的
在这些情况下,一般的指导原则是什么?在执行*cast
操作之前,您如何决定何时需要熔化数据帧 您是否需要融化数据集取决于您希望最终数据采用何种形式,以及与当前数据的关系
我通常的想法是:
对于公式的LHS,我应该有一个或多个列将成为我的“id”行。这些将作为单独的列保留在最终输出中
对于公式的RHS,我应该有一个或多个列,这些列组合起来形成新的列,在这些列中,我将“分散”我的值。当这是多个列时,dcast
将基于这些值的组合创建新列
我必须只有一列,它将提供值以填充由这些行和列创建的结果“网格”
以一个小的例子来说明,考虑这个微小的数据集:
mydf <- data.frame(
A = c("A", "A", "B", "B", "B"),
B = c("a", "b", "a", "b", "c"),
C = c(1, 1, 2, 2, 3),
D = c(1, 2, 3, 4, 5),
E = c(6, 7, 8, 9, 10)
)
请记住以上三点,比较执行以下操作时发生的情况:
dcast(mydf, A ~ C, value.var = "E")
dcast(mydf, A ~ B + C, value.var = "E")
dcast(mydf, A + B ~ C, value.var = "E")
何时需要melt
?
现在,让我们对该场景进行一个小的调整:我们希望在不进行实际聚合的情况下分散“D”和“E”列中的值。有了此更改,我们需要首先熔化数据,以便需要分散的相关值位于单个列中(上文第3点)
dfL只要现有的数据已经是长格式的,我看不出在铸造之前一般需要将其熔化。非常感谢您的详细解释。如果我理解正确,最后的melt
操作假定c(“D”,“E”)
本质上是相同的,即它们是完全相同的度量值,分布在不同的组中,并在两个不同的列中注册。@landroni,它们不一定是相同的度量值,但至少是相同的数据类型(例如,所有数字,而不是逻辑、字符或其他),您希望对其执行相同类型的聚合。关于您的另一个问题的说明可能会对此主题有更多的说明。事实上,度量值可以不同(但应为相同的数据类型),尽管在我看来,这个示例指出了acast
/dcast
运行方式中的某种基本刚性,如果您打算将它们用于透视表的话。
library(reshape2)
dcast(mydf, A ~ B, value.var = "E")
# A a b c
# 1 A 6 7 NA
# 2 B 8 9 10
dcast(mydf, A ~ C, value.var = "E")
dcast(mydf, A ~ B + C, value.var = "E")
dcast(mydf, A + B ~ C, value.var = "E")
dfL <- melt(mydf, measure.vars = c("D", "E"))
dcast(dfL, A ~ B + variable, value.var = "value")
# A a_D a_E b_D b_E c_D c_E
# 1 A 1 6 2 7 NA NA
# 2 B 3 8 4 9 5 10