Các tibble
gói có một chức năng enframe()
mà giải quyết vấn đề này bằng cách ép buộc lồng list
đối tượng để lồng tibble
(khung dữ liệu "gọn gàng") đối tượng. Dưới đây là một ví dụ ngắn gọn từ R cho Khoa học dữ liệu :
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]>
Vì bạn có một số tổ trong danh sách của mình l
, bạn có thể sử dụng unlist(recursive = FALSE)
để loại bỏ việc lồng không cần thiết để chỉ lấy một danh sách phân cấp duy nhất và sau đó chuyển đến enframe()
. Tôi sử dụng tidyr::unnest()
để hủy kết quả đầu ra thành một khung dữ liệu "gọn gàng", có hai cột của bạn (một cho nhóm name
và một cho các quan sát với các nhóm value
). Nếu bạn muốn các cột làm cho rộng, bạn có thể thêm một cột bằng cách add_column()
chỉ lặp lại thứ tự của các giá trị 132 lần. Sau đó chỉ là spread()
các giá trị.
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>