2014-02-24 41 views
0

我想在數據幀的1500個稀疏行上總計大約10000列,如colSparseX。如果我有輸入:如何摺疊非常大的稀疏數據幀

(我試過OriginalDataframe此:

coldatfra <- aggregate(. ~colID,datfra,sum) 

這:

coldatfra <- ddply(datfra, .(colID), numcolwise(sum)) 

但它不工作!)

colID <- c(rep(seq(1:6),2), rep(seq(1:2),3)) 
colSparse1 <- c(rep(1,5), rep(0,4), rep(1,2), rep(0,5), rep(1,2)) 
cPlSpars2 <- c(rep(1,3), rep(0,6), rep(1,2), rep(0,5), rep(1,2)) 
coMSparse3 <- c(rep(1,6), rep(0,3), rep(1,2), rep(0,5), rep(1,2)) 
colSpArseN <- c(rep(1,2), rep(0,7), rep(1,2), rep(0,5), rep(1,2)) 

(datfra <- data.frame(colID, colSparse1, cPlSpars2, coMSparse3, colSpArseN)) 

colID colSparse1 cPlSpars2 coMSparse3 colSpArseN 
    1   1   1   1   1 
    2   1   1   1   1 
    3   1   1   1   0 
    4   1   0   1   0 
    5   1   0   1   0 
    6   0   0   1   0 
    1   0   0   0   0 
    2   0   0   0   0 
    3   0   0   0   0 
    4   1   1   1   1 
    5   1   1   1   1 
    6   0   0   0   0 
    1   0   0   0   0 
    2   0   0   0   0 
    1   0   0   0   0 
    2   0   0   0   0 
    1   1   1   1   1 
    2   1   1   1   1 

而且想要總結每個ID上的元素(10000列 - 需要一些佔位符,因爲這是非常可變的詞)colSparse個S IN爲了得到這個:

colID colSparse1 cPlSpars2 coMSparse3 colSpArseN 
    1   2   2   2   2 
    2   2   2   2   2 
    3   1   1   1   0 
    4   2   1   2   1 
    5   2   1   2   1 
    6   0   0   1   0 

注:STR與ddply(datfra, .(colID), numcolwise(sum))治療OriginalDataframe的(OriginalDataframe)

'data.frame': 1500 obs. of 10000 variables: 
$ someword            : num 0 0 0 0 0 0 0 0 0 0 ... 
$ anotherword            : num 0 0 0 0 0 0 0 0 0 0 ... 

而且在一個較小的版本(終止)我得到:

 colID colSparse1 cPlSpars2 coMSparse3 colSpArseN 
1  0019   0   0   0   0 
NA <NA>   NA  NA   NA   NA 
NA.1 <NA>   NA  NA   NA   NA 
NA.2 <NA>   NA  NA   NA   NA 
NA.3 <NA>   NA  NA   NA   NA 
+0

我不明白這些錯誤 – rawr

+0

@rawr你好,再次:)謝謝你!我稍微擴展了這個例子,也許你現在得到了錯誤。但是,這個問題可能與'ddply'有關(它可能無法有效地工作)。是否可以避免'ddply'? – alex

+1

我複製了你的所有代碼,它運行良好。清理你的工作區並重新運行它。另外,'plyr'用於數據幀,數據幀不是矩陣。有一些包含處理稀疏矩陣的方法,我認爲是'Matrix'和'SparseM'。我不使用它們,所以我不能指出你相關的功能。 – rawr

回答

2

看看我對這個問題的回答: Mean per group in a data.frame

你的問題是類似的。如果您將正在應用的函數從中間值改爲總和,您將得到您正在查找的內容。

colstosum <- names(mydt)[2:5] 
mydt.sum <- mydt[,lapply(.SD,sum,na.rm=TRUE),by=colID,.SDcols=colstosum] 

mydt.sum 
    colID colSparse1 cPlSpars2 coMSparse3 colSpArseN 
1:  1   2   2   2   2 
2:  2   2   2   2   2 
3:  3   1   1   1   0 
4:  4   2   1   2   1 
5:  5   2   1   2   1 
6:  6   0   0   1   0 

當然,我不能保證速度或在一個大data.table缺乏sum上。此外,有一種方法可以將colSums合併到lapply函數中,但目前我無法弄清楚語法。

+0

非常感謝您的回答。在我的系統上它不起作用。在第二次嘗試中,我也加載'library(data.table)',但沒有任何改變。對於'colstosum < - 名稱(mydt [,2:5,with = F])'我在'[.data.frame'(mydt,2:5,with = F)中得到錯誤:未使用的參數(with = F)'和我得到的第二行:'錯誤'[.data.frame'(mydt,,lapply(.SD,sum,na。rm = TRUE),by = colID,:未使用的參數(by = colID,.SDcols = colstosum)'。 – alex

+0

在嘗試運行data.table命令之前,沒有將'mydt'轉換爲data.table的聲音。首先執行'mydt < - data.table(mydt)'。 – fabians