亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么rbindlist比rbind“更好”?

為什么rbindlist比rbind“更好”?

慕容708150 2019-10-05 13:58:47
我正在閱讀data.tableSO的文檔,并且從中進行的一些對話中也發現,SO rbindlist可能比SO 更好rbind。我想知道為什么是rbindlist優于rbind以及其中場景rbindlist的確有過人之處過rbind?在內存利用率方面有什么優勢嗎?
查看完整描述

3 回答

?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

通過v1.9.2,rbindlist已經發展了很多,實現了許多功能,包括:


SEXPTYPE在綁定時選擇最高的列-在v1.9.2關閉FR#2456和Bug#4981中實現。

factor正確處理列-首先在v1.8.10關閉Bug#2650時實現,然后又擴展到綁定有序因素v1.9.2,同時關閉FR#4856和Bug#5019。

此外,在中v1.9.2,rbind.data.table還獲得了一個fill參數,該參數允許通過填充缺少的列進行綁定,該實現在R中實現。


現在,在中v1.9.3,這些現有功能有了更多改進:


rbindlist獲取一個參數use.names,默認情況下是FALSE為了向后兼容。

rbindlist還獲得一個參數fill,默認情況下,該參數還FALSE用于向后兼容。

這些功能全部用C語言實現,并精心編寫,以免在增加功能時不影響速度。

由于rbindlist現在可以按名稱匹配并填寫缺少的列,因此請立即rbind.data.table致電rbindlist。唯一的區別是,use.names=TRUE默認情況下,用于rbind.data.table,以實現向后兼容。

rbind.data.frame速度降低了很多,主要是由于可以避免的副本(通過@mnel指出)(可以通過移至C來避免)。我認為這不是唯一的原因。rbind.data.frame當每個data.frame中有很多列并且要綁定很多此類data.frame時,檢查/匹配in中列名的實現也可能會變慢(如下面的基準所示)。


但是,rbindlist缺少某些功能(例如檢查因子水平或匹配名稱)的作用很?。ɑ驔]有作用),因為它比更快rbind.data.frame。這是因為它們是用C精心實現的,并且針對速度和內存進行了優化。


這是一個基準測試,著重強調了有效的綁定,同時按列名進行匹配,也使用了來自rbindlist的use.names功能v1.9.3。數據集由10000個數據幀組成,每個數據幀的大小為10 * 500。


注意:這個測試已經更新到包括比較dplyr的bind_rows


library(data.table) # 1.11.5, 2018-06-02 00:09:06 UTC

library(dplyr) # 0.7.5.9000, 2018-06-12 01:41:40 UTC

set.seed(1L)

names = paste0("V", 1:500)

cols = 500L

foo <- function() {

    data = as.data.frame(setDT(lapply(1:cols, function(x) sample(10))))

    setnames(data, sample(names))

}

n = 10e3L

ll = vector("list", n)

for (i in 1:n) {

    .Call("Csetlistelt", ll, i, foo())

}


system.time(ans1 <- rbindlist(ll))

#  user  system elapsed 

# 1.226   0.070   1.296 


system.time(ans2 <- rbindlist(ll, use.names=TRUE))

#  user  system elapsed 

# 2.635   0.129   2.772 


system.time(ans3 <- do.call("rbind", ll))

#   user  system elapsed 

# 36.932   1.628  38.594 


system.time(ans4 <- bind_rows(ll))

#   user  system elapsed 

# 48.754   0.384  49.224 


identical(ans2, setDT(ans3)) 

# [1] TRUE

identical(ans2, setDT(ans4))

# [1] TRUE

這樣,不檢查名稱就綁定列僅花費1.3,而檢查列名稱和適當地綁定僅花費1.5秒。與基本解決方案相比,它的速度快了14倍,比dplyr的版本快18倍。


查看完整回答
反對 回復 2019-10-05
?
BIG陽

TA貢獻1859條經驗 獲得超6個贊

rbind.data.frame具有特殊的“劫持”邏輯-當其第一個參數為時data.table,它將調用.rbind.data.table,它會進行一點檢查并在rbindlist內部進行調用。因此,如果您已經有data.table要綁定的對象,則rbind和之間的性能差異可能很小rbindlist。

查看完整回答
反對 回復 2019-10-05
  • 3 回答
  • 0 關注
  • 2144 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號