为什么在dcast中不能有多个value.var?

5
为什么不能在dcast中传递多个变量到value.var?从?dcast中可以看到:
“value.var是存储值的列的名称,参见guess_value以获取默认策略。”
它没有明确指出只能传递一个单一变量作为value。但如果我尝试这样做,就会出现错误:
> library("reshape2")
> library("MASS")
> 
> dcast(Cars93, AirBags ~ DriveTrain, mean, value.var=c("Price", "Weight"))
Error in .subset2(x, i, exact = exact) : subscript out of bounds
In addition: Warning message:
In if (!(value.var %in% names(data))) { :
  the condition has length > 1 and only the first element will be used

那么对于实施这种限制有好的理由吗?并且是否可能通过绕过此限制来解决(例如使用reshape等)?


2
为什么不进一步“融化”数据,然后再使用“dcast”呢? - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto,如果measure.vars是不同类型的呢?或者数据太大怎么办? - Arun
@Arun,你是否试图在不同的数据类型上使用相同的函数(除了length可能以外)? - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto,在第一个问题上,我想到的数据不需要聚合函数,只需要简单的宽变长重塑,带有不同类型的列。在第二个问题上,:) 内存仍然是一个问题...因为 melting 也会占用空间... - Arun
有点相关:https://dev59.com/1WAg5IYBdhLWcg3w5eVk - landroni
显示剩余3条评论
3个回答

7
这个问题与您今天早些时候提出的另一个问题非常相关。在此问题中,@beginneR在评论中写道:“只要现有数据已经呈现长格式,我不认为有任何普遍需要在投射之前进行融合。” 在我在您另一个问题中发布的答案中,我举了一个需要使用melt或者如何判断数据是否足够长的例子。

这里的问题是另一个需要进一步melt的例子,因为我的回答中的第3点未得到满足。

要获取所需的行为,请尝试以下操作:

C93L <- melt(Cars93, measure.vars = c("Price", "Weight"))
dcast(C93L, AirBags ~ DriveTrain + variable, mean, value.var = "value")
#              AirBags 4WD_Price 4WD_Weight Front_Price Front_Weight
# 1 Driver & Passenger       NaN        NaN    26.17273     3393.636
# 2        Driver only     21.38       3623    18.69286     2996.250
# 3               None     13.88       2987    12.98571     2703.036
#   Rear_Price Rear_Weight
# 1      33.20      3515.0
# 2      28.23      3463.5
# 3      14.90      3610.0

另一种方法是使用aggregate计算mean,然后使用reshapedcast从“长格式”转换为“宽格式”。两者都需要,因为reshape不执行任何聚合操作。
temp <- aggregate(cbind(Price, Weight) ~ AirBags + DriveTrain, 
                  Cars93, mean)
#              AirBags DriveTrain    Price   Weight
# 1        Driver only        4WD 21.38000 3623.000
# 2               None        4WD 13.88000 2987.000
# 3 Driver & Passenger      Front 26.17273 3393.636
# 4        Driver only      Front 18.69286 2996.250
# 5               None      Front 12.98571 2703.036
# 6 Driver & Passenger       Rear 33.20000 3515.000
# 7        Driver only       Rear 28.23000 3463.500
# 8               None       Rear 14.90000 3610.000

reshape(temp, direction = "wide", 
        idvar = "AirBags", timevar = "DriveTrain")
#              AirBags Price.4WD Weight.4WD Price.Front Weight.Front
# 1        Driver only     21.38       3623    18.69286     2996.250
# 2               None     13.88       2987    12.98571     2703.036
# 3 Driver & Passenger        NA         NA    26.17273     3393.636
#   Price.Rear Weight.Rear
# 1      28.23      3463.5
# 2      14.90      3610.0
# 3      33.20      3515.0

优秀的例子。谢谢。 - landroni

7

我也遇到了同样的问题,并在这个答案中找到了解决方案:Error using dcast with multiple value.var,建议按照以下方式“强制”使用data.table的dcast函数:

# multiple value.var
data.table::dcast(Cars93, AirBags ~ DriveTrain, mean, value.var=c("Price", "Weight"))

我能够顺利地转换多个变量,且没有任何错误。


5

尝试使用setDT或as.data.table将您的数据框强制转换为数据表。

dcast(setDT(C93L), AirBags ~ DriveTrain , mean, value.var=c("Price","Weight"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接