2012-12-18 38 views
2

我需要將我已導入到R中的數據集共享爲ffdf對象。 我的目標是能夠輕鬆地將我的ffdf數據集導出爲CSV格式,而不必擔心NA值會導致輸出文件的大小膨脹。導出不帶NA值的FFDF

如果我用一個簡單的數據幀的工作,我會用下面的語法:

write.csv(df, "C:/path/data.csv", row.names=FALSE, na="") 

但write.csv.ffdf功能似乎並沒有採取「NA」作爲參數。任何人都可以告訴我正確的語法,這樣我就不必對輸出文件進行後期處理來刪除NA值了嗎?

+1

如何使用帶有所需參數的'write.table'?順便說一句,因爲「ffdf」不是基礎對象類型,所以你應該發佈你正在使用的支持這種類型的包。 –

+0

我的歉意。 ff軟件包支持這種類型的數據幀。 – inkhorn

+0

我在'write.table.ffdf'文檔中看不到任何內容,它們不能分配'na'值,所以也許你應該調用'write.table'並指定'FUN'值。同時,嘗試從本地數據框中抽取一個小而具有代表性的ffdf對象樣本,並查看當您嘗試使用write.csv時會發生什麼。 –

回答

2

我認爲你正在對write.csv.ffdf的行爲進行不準確的表徵。

require(ff) 
# What follows is a minor modification of the first example in the `write.* help page. 

> x <- data.frame(log=rep(c(FALSE, TRUE), length.out=26), int=c(NA, 2:26), 
        dbl=c(1:25,NA) + 0.1, fac=factor(c(letters[2:26], NA)), 
        ord=c(NA, ordered(LETTERS[2:26])), dct=Sys.time()+1:26, 
        dat=seq(as.Date("1910/1/1"), length.out=26, by=1)) 
> ffx <- as.ffdf(x) 
> write.csv(ffx, na="") 
"","log","int","dbl","fac","ord","dct","dat" 
"1",FALSE,,1.1,"b",,2012-12-18 12:18:23,1910-01-01 
"2",TRUE,2,2.1,"c",1,2012-12-18 12:18:24,1910-01-02 
"3",FALSE,3,3.1,"d",2,2012-12-18 12:18:25,1910-01-03 
"4",TRUE,4,4.1,"e",3,2012-12-18 12:18:26,1910-01-04 
"5",FALSE,5,5.1,"f",4,2012-12-18 12:18:27,1910-01-05 
"6",TRUE,6,6.1,"g",5,2012-12-18 12:18:28,1910-01-06 
"7",FALSE,7,7.1,"h",6,2012-12-18 12:18:29,1910-01-07 
"8",TRUE,8,8.1,"i",7,2012-12-18 12:18:30,1910-01-08 
"9",FALSE,9,9.1,"j",8,2012-12-18 12:18:31,1910-01-09 
"10",TRUE,10,10.1,"k",9,2012-12-18 12:18:32,1910-01-10 
"11",FALSE,11,11.1,"l",10,2012-12-18 12:18:33,1910-01-11 
"12",TRUE,12,12.1,"m",11,2012-12-18 12:18:34,1910-01-12 
"13",FALSE,13,13.1,"n",12,2012-12-18 12:18:35,1910-01-13 
"14",TRUE,14,14.1,"o",13,2012-12-18 12:18:36,1910-01-14 
"15",FALSE,15,15.1,"p",14,2012-12-18 12:18:37,1910-01-15 
"16",TRUE,16,16.1,"q",15,2012-12-18 12:18:38,1910-01-16 
"17",FALSE,17,17.1,"r",16,2012-12-18 12:18:39,1910-01-17 
"18",TRUE,18,18.1,"s",17,2012-12-18 12:18:40,1910-01-18 
"19",FALSE,19,19.1,"t",18,2012-12-18 12:18:41,1910-01-19 
"20",TRUE,20,20.1,"u",19,2012-12-18 12:18:42,1910-01-20 
"21",FALSE,21,21.1,"v",20,2012-12-18 12:18:43,1910-01-21 
"22",TRUE,22,22.1,"w",21,2012-12-18 12:18:44,1910-01-22 
"23",FALSE,23,23.1,"x",22,2012-12-18 12:18:45,1910-01-23 
"24",TRUE,24,24.1,"y",23,2012-12-18 12:18:46,1910-01-24 
"25",FALSE,25,25.1,"z",24,2012-12-18 12:18:47,1910-01-25 
"26",TRUE,26,,,25,2012-12-18 12:18:48,1910-01-26 

如果你的目標是最大限度地減少在寫操作的RAM佔用,那麼先來看看:

getOption("ffbatchbytes") 
+0

謝謝Carl和迪文。我沒有意識到你可以簡單地使用write.csv/table和ffdf對象,並且仍然可以在你的計算機的資源中運行良好:) – inkhorn

+0

我剛剛在一個非常大的ffdf上使用write.csv來實踐,並且它佔用了在此過程中超過幾千兆字節的RAM。 我仍然想知道如何編寫一個ffdf到csv,沒有NA值,但同時節省了RAM使用量。 – inkhorn

+1

@inkhorn:在ffdf對象上使用'write.csv'確實使用'write.csv.ffdf'。解釋器被派遣到該功能。你沒有告訴我們爲什麼你認爲這是NA佔用空間,所以也許這個理論在測試中也會被證明是錯誤的? (我會想象R將使用盡可能多的RAM。) –

0

write.csv.ffdf不具有na參數,但write.table.ffdf傳遞na參數到write.table1功能它包裹。 只需使用sep=","以及你很好去。

即使對於大的ff變量,這也可以工作。