如何使用NULL扁平化数据框列表?

时间:2018-09-22 21:27:01

标签: r dplyr

我正在尝试转换此列表:

收入<-list(list(list(2016L,“ hello”,NULL))

变成小标题,将所有NULL转换为NA

  X2016L X.hello. NA.
1   2016    hello  NA

这是我的解决方案,但我想知道是否有使用as_tibble

的更直接的方法
tibble(year = map_dbl(income,1),
       geo= map_chr(income,2),
       income = map_chr(income,3, .default = NA))

例如:

> l %>% as.data.frame()
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 1, 0
> l %>% as_tibble()
Error: Column 1 must be named

2 个答案:

答案 0 :(得分:0)

1。创建列表

income <- list(list(2016L, "hello", NULL))

这给了我们

income

[[1]]
[[1]][[1]]
[1] 2016

[[1]][[2]]
[1] "hello"

[[1]][[3]]
NULL

2。强制列表变成小标题

income_tibble <- as_tibble(t(sapply(income,c)))

这给了我们

income_tibble

# A tibble: 1 x 3
  V1        V2        V3    
  <list>    <list>    <list>
1 <int [1]> <chr [1]> <NULL>

3。将所有NULL替换为NA

income_tibble[income_tibble == ""] <- NA

应给我们的

income_tibble

# A tibble: 1 x 3
  V1        V2        V3       
  <list>    <list>    <list>   
1 <int [1]> <chr [1]> <lgl [1]>

评论:上面的代码实际上是应如何工作的。但是,在我的机器上,只能使用以下代码将其达到预期的结果:

income_tibble[income_tibble == "NULL"] <- NA

也许其他人可以了解为什么?

答案 1 :(得分:0)

L创建一个列表income[[1]],并用NA替换每个零长度分量。然后设置组件名称(因为小标题必须具有列名)并转换为小标题。

library(tibble)

L <- income[[1]]
L[lengths(L) == 0] <- NA
names(L) <- c("year", "geo", "income")
as.tibble(L)

## # A tibble: 1 x 3
##       a b     c    
##   <int> <chr> <lgl>
## 1  2016 hello NA  

或使用管道:

library(dplyr)
library(tibble)

income %>% 
  first %>%
  replace(lengths(.) == 0, NA) %>% 
  setNames(c("year", "geo", "income")) %>% 
  as.tibble