programing

rbindlist가 rbind보다 "더 나은" 이유는 무엇입니까?

mailnote 2023. 6. 20. 21:47
반응형

rbindlist가 rbind보다 "더 나은" 이유는 무엇입니까?

는 의문화작있다습니고수하행의 를 검토하고 있습니다.data.table 몇 도 알 수 있었습니다.rbindlist보다 더 나은 것으로 예상됩니다.rbind.

왜 그런지 알고 싶습니다.rbindlist보다 나은rbind 에서.rbindlist을 훨씬 능가하는.rbind?

메모리 활용도 측면에서 이점이 있습니까?

rbindlist는 의최화버다니의 입니다.do.call(rbind, list(...))사용할 때 속도가 느린 것으로 알려진rbind.data.frame


그것이 정말로 탁월한 부분은 어디입니까?

위치를 보여주는 몇 가지 질문rbindlist이 나다

data.frames 목록을 행별로 빠르게 벡터화하여 병합

do.call 및 ldply를 사용하여 긴 data.frame 목록(~100만 개)을 단일 data.frame으로 변환하는 데 문제가 발생했습니다.

이들은 얼마나 빠른지를 보여주는 벤치마크를 가지고 있습니다.


rbind.data.frame이 느린 이유가 있습니다.

rbind.data.frame많은검 이일다니로치합름별며하. (사실을 합니다.) ("rbind.data.frame")rbindlist검사를, 할 것입니다.

예를 들어

do.call(rbind, list(data.frame(a = 1:2, b = 2:3), data.frame(b = 1:2, a = 2:3)))
##    a b
## 1  1 2
## 2  2 3
## 3  2 1
## 4  3 2

rbindlist(list(data.frame(a = 1:5, b = 2:6), data.frame(b = 1:5, a = 2:6)))
##     a b
##  1: 1 2
##  2: 2 3
##  3: 1 2
##  4: 2 3

rbindlist의 몇 가지 다른 제한 사항

그들을 상대하는 데 어려움을 겪곤 했습니다.factors이후 수정된 버그로 인해:

rbindlistdata.table하나는 요인이 있고 다른 하나는 열에 대한 문자 유형이 있습니다(Bug #2650).

중복된 열 이름에 문제가 있습니다.

경고 메시지: inrbindlist(allargs): 강제로 도입된 NA: data.table의 버그 가능성? (버그 #2384)


rbind.data.frame rowname은 답답할 수 있습니다.

rbindlist 처리할 수 .lists data.frames그리고.data.tables 행 이 없는합니다. data.table을 반환합니다.

당신은 다음을 사용하여 혼란스러운 이름을 얻을 수 있습니다.do.call(rbind, list(...))

do.call 내부에서 rbind를 사용할 때 행 이름 변경을 방지하는 방법은 무엇입니까?


메모리 효율성

기억력에 는.rbindlist는 에구됨에서 됩니다.C그래서 기억력이 효율적이고, 그것은 사용합니다.setattr합니다.

rbind.data.frame는 에구됨에서 됩니다.R많은할사하용다니합고을당다를 합니다.attr<-)class<-그리고.rownames<-이 모든 작업은 (내부적으로) 생성된 data.frame의 복사본을 만듭니다.

타고v1.9.2,rbindlist상당히 발전하여 다음과 같은 많은 기능을 구현했습니다.

로가추에서는,v1.9.2,rbind.data.table또한 a를 얻었습니다.fillR로 구현된 결측 열을 채워 바인딩할 수 있는 인수입니다.

지은금에서v1.9.3이러한 기존 기능은 훨씬 더 개선되었습니다.

  • rbindlistuse.names은 기적으로입니다.FALSE이전 버전과의 호환성을 위해.
  • rbindlist 또한주펼칩다니을장▁an다▁argument를 얻습니다.fill으로 " 적으또한로기본"이기도 .FALSE이전 버전과의 호환성을 위해.
  • 이러한 기능은 모두 C로 구현되었으며, 기능을 추가하는 동안 속도가 저하되지 않도록 주의하여 작성되었습니다.
  • 때부터rbindlist이제 이름으로 일치하고 누락된 열을 채울 수 있습니다.rbind.data.table막 걸려온 전화rbindlist은 금지입니다. 유일한 차이점은use.names=TRUE에 대해 rbind.data.table이전 버전과의 호환성을 위해.

rbind.data.frame(C로 이동하면) 피할 수 있는 복사(@mnel이 지적한 것도 있음) 때문에 속도가 상당히 느려집니다.그것만이 이유는 아니라고 생각합니다./▁names의 컬럼 이름 rbind.data.frame또한 data.frame당 열 수가 많고 바인딩할 data.frame이 많은 경우 속도가 느려질 수 있습니다(아래 벤치마크 참조).

그 나러은, 것그그.rbindlist 기능: 요인 이름 확인)은 부족(ed) 요특기은(ed) 능이같은는(ed) 다과정름일또음(d) 가매작빠더(no) .rbind.data.frame속도와 메모리에 최적화된 C에서 신중하게 구현되었기 때문입니다.

입니다.rbindlistuse.names의 특집 .v1.9.3데이터 세트는 각각 크기가 10*500인 10000 data.frames로 구성됩니다.

이는 NB와의 되었습니다.dplyrbind_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초가 더 걸렸습니다..dplyr의 버전.

그렇다면 이것은 아마도 버그로 간주되어야 할까요?

# let us make a very simple list here
l <- list('a' = 1, 'b' = 2, 'c' = 3)
l
$a
[1] 1

$b
[1] 2

$c
[1] 3

# check that it is a list
class(l)
#[1] "list"
typeof(l)
#[1] "list"

그리고.rbind할 수 .

do.call('rbind', l) 
#    [,1]
# a    1
# b    2
# c    3

하만사때할용지를 할 때는.rbindlist한 명이 이걸 받나요?

rbindlist(l)
Error in rbindlist(l) : 
  Item 1 of input is not a data.frame, data.table or list

위에서 입력이 다음과 같은 것을 확인했기 때문에 오류 메시지는 혼란 그 이상입니다.list안 그랬습니까?
이 단순한 경우에 대한 기능의 올바른 적용이 어딘가에 문서화되어 있습니까?
...와 ...의 힌트를 하겠습니다.와 유사하거나 동일한 결과를 기대하고 있었으므로 어떠한 힌트라도 감사합니다.do.call('rbind', l)나는 왜 그런지 약간 혼란스럽습니다.data.table함수는 내가 잘못된 클래스 오류를 해결할 때 동일한 목록에 있는 동등한 호출의 결과를 바꾸기로 결정합니다. 예를 들어 이것을 수행함으로써?

rbindlist(list(l))
# will result in
   a b c
1: 1 2 3

언급URL : https://stackoverflow.com/questions/15673550/why-is-rbindlist-better-than-rbind

반응형