[r] 목록을 데이터 프레임으로 변환

중첩 된 데이터 목록이 있습니다. 길이는 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.framelist(@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>