rowSums打破了由库中的强制转换生成的一列data.frame(重塑) - 为什么?

时间:2013-07-26 22:16:34

标签: r dataframe reshape

这里有一些代码 - 我不明白为什么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 - 当子集只有一列时,我注意到了这种行为。这是一个可重复的小例子。

1 个答案:

答案 0 :(得分:2)

rowSums来电as.matrixas.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方法,并且没有问题。