[英]R performance with data reshaping
我正在嘗試重塑R中的數據框,並且使用推薦的方法似乎有問題。 數據框具有以下結構:
ID DATE1 DATE2 VALTYPE VALUE
'abcd1233' 2009-11-12 2009-12-23 'TYPE1' 123.45
...
VALTYPE
是一個字符串,是一個只有2個值的因子(比如TYPE1
和TYPE2
)。 我需要根據公共ID和DATE將其轉換為以下數據幀(“寬”轉置):
ID DATE1 DATE2 VALUE.TYPE1 VALUE.TYPE2
'abcd1233' 2009-11-12 2009-12-23 123.45 NA
...
數據框有超過4,500,000個觀測值(盡管大約70%的VALUE
是NA
)。 該機器是基於Intel的Linux工作站,具有4Gb RAM。 將數據(從壓縮的Rdata文件)加載到新的R進程使其增長到大約250Mb,這顯然留下了大量的重塑空間。
這是我迄今為止的經歷:
使用vanilla reshape()
方法:
tbl2 < - reshape(tbl,direction =“wide”,idvar = c(“ID”,“DATE1”,“DATE2”),timevar =“VALTYPE”);
結果: Error: cannot allocate vector of size 4.8 Gb
使用reshape
包的cast()
方法:
tbl2 < - cast(tbl,ID + DATE1 + DATE2~VALTYPE);
結果:R進程消耗所有RAM,看不到盡頭。 不得不最終殺死這個過程。
使用by()
和merge()
:
sp < - by(tbl [c(1,2,3,5)],tbl $ VALTYPE,function(x)x); tbl < - merge(sp [[“TYPE1”]],sp [[“TYPE2”]],by = c(“ID”,“DATE1”,“DATE2”),all = TRUE,sort = TRUE);
結果:工作正常,雖然這不是很優雅和萬無一失(即如果添加更多類型它會破壞)。
為了增加對傷害的侮辱,可以在大約3行AWK或Perl(並且幾乎沒有使用任何RAM)中簡單地實現所討論的操作。 所以問題是:在沒有消耗所有可用RAM的情況下,使用推薦方法在R中執行此操作的更好方法是什么?
一個有用的技巧是將id變量組合成一個字符向量,然后進行重塑。
tbl$NEWID <- with(tbl, paste(ID, DATE1, DATE2, sep=";"))
tbl2 <- recast(tbl2, NEWID ~ VALTYPE, measure.var="VALUE")
在我的intel core2 duo 2.2ghz macbook中,它在類似大小的問題上快了大約40%。
那么以非R方式做這件事呢? 我假設你為ID,DATE1,DATE2的每個值都有一個TYPE1和一個TYPE2行? 然后按這些變量對數據幀進行排序,並編寫一個大的for循環。 您可以重復執行rbind()操作來構建表,或者您可以嘗試預先分配表(可能)並僅使用[< - 分配VALUE.TYPE1和VALUE.TYPE2個插槽,這應該在以下情況下進行分配:地點。
(注意,如果你使用的是rbind(),我相信如果你有任何因子變量它是低效的,所以確保一切都是一個字符!)
也許你可以使用cat()函數?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.