2013-07-26 30 views
1

下面是一些代碼 - 我不明白爲什麼rowSums會在它發生中斷時,以及爲什麼更改test3的類會修復它。這看起來很奇怪。這是一個錯誤嗎?如果不是,我錯過了什麼?rowSums在由庫中生成的單列數據幀中重構(重塑) - 爲什麼?

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? 

上下文:我有一個由cast生成的大數據框。然後,我以編程方式在該數據框的幾個不同子列上調用rowSums - 並且當子集只有一列時,我注意到了這種行爲。這是一個很小的可重複的例子。

+2

答案可能是:不要這樣做。或使用'reshape2 :: dcast' –

+0

相關問題和[答案](http://stackoverflow.com/a/17873683/1270695)這裏。 – A5C1D2H2I1M1N2O1R2T1

回答

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方法,並且沒有問題。

+0

我以爲'reshape'已被'reshape2'取代? –

+1

@DWin這是,我可能應該提到,在我的答案中,在這個問題上,重塑'bug'的錯誤報告可能並不真正相關。 – joran