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이후 수정된 버그로 인해:
rbindlist 두 data.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이러한 기존 기능은 훨씬 더 개선되었습니다.
rbindlist을use.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에서 신중하게 구현되었기 때문입니다.
입니다.rbindlist의use.names의 특집 .v1.9.3데이터 세트는 각각 크기가 10*500인 10000 data.frames로 구성됩니다.
이는 NB와의 되었습니다.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초가 더 걸렸습니다..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
'programing' 카테고리의 다른 글
| SQL 쿼리에서 SQL Server 열에 하나(+1)를 추가하는 방법 (0) | 2023.06.20 |
|---|---|
| 오라클의 LOB 세그먼트(SYS_LOB)를 이해하시겠습니까? (0) | 2023.06.20 |
| Android에서 스크린샷을 프로그래밍 방식으로 촬영하는 방법은 무엇입니까? (0) | 2023.06.20 |
| ASP.NET Eval() 및 Bind() 이해 (0) | 2023.06.20 |
| Oracle은 전체 텍스트 검색을 지원합니까? (0) | 2023.06.20 |