1

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

4

1 回答 1

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直接调用常规方法,没有问题。

于 2013-07-26T22:31:07.420 回答