我正在尝试转换此列表:
收入<-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
答案 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