列表转化为数据框
- 已编辑
一个和大鹏大同小异的办法:
l = list(l1 = list(1, 2, NULL, 4), l2 = list(11, NULL, 33, NULL))
df <- do.call(cbind, l)
df[df == "NULL"] = NA
df
#> l1 l2
#> 1 1 11
#> 2 2 NA
#> 3 NA 33
#> 4 4 NA
<sup>Created on 2022-04-15 by the reprex package (v2.0.1)</sup>
- 已编辑
Liechi 我最初写的跟你的这个类似,但是发现得到的数据结构有点复杂:
> str(df)
List of 8
$ : num 1
$ : num 2
$ : logi NA
$ : num 4
$ : num 11
$ : logi NA
$ : num 33
$ : logi NA
- attr(*, "dim")= int [1:2] 4 2
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "l1" "l2"
所以前后增加了一些操作,目的只是为了得到一个简单的 data frame。
不过,你这个解法启发我动了点歪脑筋,可以绕开烧脑的 lapply sapply apply 家族:
df <- do.call(cbind, l)
write.table(df, 'clipboard')
read.table('clipboard', na.strings = 'NULL')
Cloud2016 赞 data.table,确实一剑封喉。
data.frame(t(data.table::rbindlist(l)))
#> Warning in data.table::rbindlist(l): Column 3 [''] of item 1 is length 0. This
#> (and 2 others like it) has been filled with NA (NULL for list columns) to make
#> each item uniform.
#> X1 X2
#> V1 1 11
#> V2 2 NA
#> V3 NA 33
#> V4 4 NA
l = list(l1 = list(1, 2, NULL, 4), l2 = list(11, NULL, 33, NULL))
library(purrr)
l %>%
flatten() %>%
matrix(ncol = 2) %>%
as.data.frame() %>%
set_names(names(l)) -> df
df[df == "NULL"] = NA
print(df)
#> l1 l2
#> 1 1 11
#> 2 2 NA
#> 3 NA 33
#> 4 4 NA
<sup>Created on 2022-04-15 by the reprex package (v2.0.1)</sup>
l = list(l1 = list(1, 2, NULL, 4), l2 = list(11, NULL, 33, NULL))
l |>
tibble::as_tibble() |>
as.data.frame() -> df
df[df == "NULL"] = NA
print(df)
#> l1 l2
#> 1 1 11
#> 2 2 NA
#> 3 NA 33
#> 4 4 NA
<sup>Created on 2022-04-15 by the reprex package (v2.0.1)</sup>
- 已编辑
library(tidyverse)
unnest(as_tibble(l))
不知道为什么,好像满足要求了。
1 个月 后
plumber
想起来这里最好加个 keep_empty = T
,不然全为 NULL
的行会被删掉
l = list(l1 = list(1, 2, NULL, 4), l2 = list(11, NULL, NULL, NULL))
unnest(as_tibble(l))
unnest(as_tibble(l), keep_empty = T)
chuxinyuan 添加标签 已解决 标签