각 요소가 명명 된 목록 인 목록이 있지만 요소가 모든 곳에서 동일하지는 않습니다. 여기 와 여기 에서 목록 목록을 데이터 프레임으로 변환하는 방법에 대한 솔루션을 읽었 지만 목록이 동일하지 않으면 작동하지 않습니다.
예-혼합 유형도 있지만 솔루션이 모든 것을 문자로 강제하면 괜찮습니다.
lisnotOK <- list(list(a=1, b=2, c="hi"), list(b=2, c="hello", d="nope"))
결과는 rbind.fill
plyr 또는 dplyr 과 같이 목록으로 열을 채울 수없는 NA rbind_all
를 가져야합니다.
예
lisOK <- list(list(a=1, b=2, c="hi"), list(a=3, b=5, c="bye"))
# One of many solutions
do.call(rbind.data.frame, lisOK)
# gives
a b c
2 1 2 hi
21 3 5 bye
사용하는 모든 솔루션 rbind
, 또는 시도가 만들 수 lisnotOK
위의 링크 된 게시물에있는 예는 없다 일을 반면 내가 사용하려고하는 경우에도 매트릭스로는, 실패 rbind_all
또는 rbind.fill
.
한 가지 해결책은 연속적인 각 목록이 데이터 프레임으로 변경되고 데이터 프레임 rbind_all
에 바인딩하는 데 사용하는 추악한 for 루프 입니다.
누구든지 효율적인 솔루션을 알고 있습니까?
data.frame(.)
바인딩하기 전에 목록의 각 요소에서 사용 하는 모든 함수 는 매우 비효율적입니다 (불필요한 것은 말할 것도 없습니다). 여기서 얻을 수있는 data.table
's rbindlist
(v1.9.3에서)를 사용하는 또 다른 방법 이 있습니다 .
require(data.table) ## 1.9.3
rbindlist(lisnotOK, fill=TRUE)
# a b c d
# 1: 1 2 hi NA
# 2: NA 2 hello nope
목록 목록 (이 질문에서와 같이), data.frames 및 data.tables에서 작동합니다.
이것이 아니라면 Ananda의 list2mat
기능으로 갈 것입니다 (당신의 유형이 모두 동일하다면).
Ananda의 L2
데이터 에 대한 벤치 마크 :
fun1 <- function(inList) ldply(inList, as.data.frame)
fun2 <- function(inList) list2mat(inList)
fun3 <- function(inList) rbindlist(inList, fill=TRUE)
fun4 <- function(inList) rbind_all(lapply(inList, as.data.frame))
microbenchmark(fun1(L2), fun2(L2), fun3(L2), fun4(L2), times = 10)
# Unit: milliseconds
# expr min lq median uq max neval
# fun1(L2) 1927.857847 2161.432665 2221.999940 2276.241366 2366.649614 10
# fun2(L2) 12.039652 12.167613 12.361629 12.483751 16.040885 10
# fun3(L2) 1.225929 1.374395 1.473621 1.510876 1.858597 10
# fun4(L2) 1435.153576 1457.053482 1492.334965 1548.547706 1630.443430 10
참고 : as.data.frame(.)
대신 사용 했습니다 data.frame(.)
(이전이 약간 더 빠름).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다