簡體   English   中英

具有數據整形的R性能

[英]R performance with data reshaping

我正在嘗試重塑R中的數據框,並且使用推薦的方法似乎有問題。 數據框具有以下結構:

ID                     DATE1             DATE2            VALTYPE        VALUE
'abcd1233'         2009-11-12        2009-12-23           'TYPE1'        123.45
...

VALTYPE是一個字符串,是一個只有2個值的因子(比如TYPE1TYPE2 )。 我需要根據公共ID和DATE將其轉換為以下數據幀(“寬”轉置):

ID                     DATE1             DATE2            VALUE.TYPE1  VALUE.TYPE2
'abcd1233'             2009-11-12        2009-12-23       123.45           NA
...

數據框有超過4,500,000個觀測值(盡管大約70%的VALUENA )。 該機器是基於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM