중첩 된 데이터 목록이 있습니다. 길이는 132이고 각 항목은 길이가 20 인 목록입니다. 이 구조를 132 행과 20 열의 데이터가있는 데이터 프레임으로 변환 하는 빠른 방법이 있습니까?
다음은 사용할 샘플 데이터입니다.
l <- replicate(
132,
list(sample(letters, 20)),
simplify = FALSE
)
답변
목록의 목록을 다음과 같이 가정합니다 l
.
df <- data.frame(matrix(unlist(l), nrow=length(l), byrow=T))
위의 모든 문자 열을 인수로 변환하여 data.frame () 호출에 매개 변수를 추가 할 수 있습니다.
df <- data.frame(matrix(unlist(l), nrow=132, byrow=T),stringsAsFactors=FALSE)
답변
와 rbind
do.call(rbind.data.frame, your_list)
편집 : 이전 버전 반환 data.frame
의 list
(@IanSudbery 댓글에서 지적) ‘는 벡터 대신이야.
답변
plyr
패키지 를 사용할 수 있습니다 . 예를 들어 양식의 중첩 목록
l <- list(a = list(var.1 = 1, var.2 = 2, var.3 = 3)
, b = list(var.1 = 4, var.2 = 5, var.3 = 6)
, c = list(var.1 = 7, var.2 = 8, var.3 = 9)
, d = list(var.1 = 10, var.2 = 11, var.3 = 12)
)
이제 길이가 4이고 각 목록 l
의 길이가 3 인 다른 목록이 있습니다. 이제 실행할 수 있습니다
library (plyr)
df <- ldply (l, data.frame)
@Marek 및 @nico 답변과 동일한 결과를 얻습니다.
답변
data.frame(t(sapply(mylistlist,c)))
sapply
그것을 행렬로 변환합니다.
data.frame
행렬을 데이터 프레임으로 변환합니다.
답변
목록이라고 가정 L
하고
data.frame(Reduce(rbind, L))
답변
패키지 data.table
에는의 rbindlist
초고속 구현 기능 이 do.call(rbind, list(...))
있습니다.
이 목록을 취할 수 lists
, data.frames
또는 data.tables
입력으로.
library(data.table)
ll <- list(a = list(var.1 = 1, var.2 = 2, var.3 = 3)
, b = list(var.1 = 4, var.2 = 5, var.3 = 6)
, c = list(var.1 = 7, var.2 = 8, var.3 = 9)
, d = list(var.1 = 10, var.2 = 11, var.3 = 12)
)
DT <- rbindlist(ll)
이에서 data.table
상속을 반환합니다 data.frame
.
당신이 경우 정말 data.frame 사용으로 다시 변환 할as.data.frame(DT)
답변
tibble
패키지 기능을 갖는 enframe()
로 해결할 중첩 강요함으로써이 문제 있음 list
중첩에 객체 tibble
( “단정”데이터 프레임) 객체. 다음은 R for Data Science 의 간단한 예입니다 .
x <- list(
a = 1:5,
b = 3:4,
c = 5:6
)
df <- enframe(x)
df
#> # A tibble: 3 × 2
#> name value
#> <chr> <list>
#> 1 a <int [5]>
#> 2 b <int [2]>
#> 3 c <int [2]>
목록에 여러 개의 중첩 l
이 있으므로를 사용하여 unlist(recursive = FALSE)
불필요한 중첩을 제거하여 단일 계층 목록 만 가져온 다음에 전달할 수 enframe()
있습니다. 나는 사용 tidyr::unnest()
하여 두 개의 열 (그룹의 하나가 하나의 수준 “단정”데이터 프레임에 출력 unnest로 name
하고, 그룹과 관찰을위한 하나 value
). 너비가 넓은 열을 원하면 add_column()
값의 순서를 132 번 반복 하여 열을 추가 할 수 있습니다 . 그런 다음 spread()
값만.
library(tidyverse)
l <- replicate(
132,
list(sample(letters, 20)),
simplify = FALSE
)
l_tib <- l %>%
unlist(recursive = FALSE) %>%
enframe() %>%
unnest()
l_tib
#> # A tibble: 2,640 x 2
#> name value
#> <int> <chr>
#> 1 1 d
#> 2 1 z
#> 3 1 l
#> 4 1 b
#> 5 1 i
#> 6 1 j
#> 7 1 g
#> 8 1 w
#> 9 1 r
#> 10 1 p
#> # ... with 2,630 more rows
l_tib_spread <- l_tib %>%
add_column(index = rep(1:20, 132)) %>%
spread(key = index, value = value)
l_tib_spread
#> # A tibble: 132 x 21
#> name `1` `2` `3` `4` `5` `6` `7` `8` `9` `10` `11`
#> * <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 1 d z l b i j g w r p y
#> 2 2 w s h r i k d u a f j
#> 3 3 r v q s m u j p f a i
#> 4 4 o y x n p i f m h l t
#> 5 5 p w v d k a l r j q n
#> 6 6 i k w o c n m b v e q
#> 7 7 c d m i u o e z v g p
#> 8 8 f s e o p n k x c z h
#> 9 9 d g o h x i c y t f j
#> 10 10 y r f k d o b u i x s
#> # ... with 122 more rows, and 9 more variables: `12` <chr>, `13` <chr>,
#> # `14` <chr>, `15` <chr>, `16` <chr>, `17` <chr>, `18` <chr>,
#> # `19` <chr>, `20` <chr>