这里有一些代码 - 我不明白为什么rowSums会崩溃,为什么更改test3的类会修复它。这看起来很奇怪。这是一个错误吗?如果没有,我错过了什么?
library(reshape)
test <- data.frame(x=1:5)
rowSums(test) # Works
class(test) # "data.frame"
## Trying to break rowSums; see below
class(test) <- c("data.frame", "cast_df")
rowSums(test) # Works, but see below
vars <- c("x", "y", "z")
test2 <- data.frame(label=rep(c("A", "B"), c(3, 3)),
variable=rep(vars, 2),
value=1:6)
test2.cast <- cast(test2, label ~ variable, value="value")
rowSums(test2.cast[, vars]) # Works
rowSums(test2.cast[, "y"]) # Breaks because of drop=TRUE
test3 <- test2.cast[, "y", drop=FALSE]
rowSums(test3) # Why does this break?
class(test3) # c("cast_df", "data.frame")
class(test3) <- "data.frame"
rowSums(test3) # Works! Why?
上下文:我有一个由强制转换生成的大数据框。然后,我以编程方式在该数据框的几个不同列的子集上调用rowSums - 当子集只有一列时,我注意到了这种行为。这是一个可重复的小例子。
答案 0 :(得分:2)
rowSums
来电as.matrix
。 as.matrix.cast_df
的前两行是:
ids <- attr(x, "idvars")
mat <- as.matrix.data.frame(x[, setdiff(names(x), ids)])
注意那里缺少drop = TRUE
。当您将类重置为data.frame
时,不会调用此方法,而是直接调用常规as.matrix.data.frame
方法,并且没有问题。