在json中丢失项目时返回NA

时间:2018-04-07 21:17:30

标签: r list jsonlite

我正在使用一个函数来迭代几个jsons,如下所示:

my_tibble <- tibble(col_a = json$xyz$xyz,
col_b = json$xyz2$xyz2,
col_c = json$xyz3,
...)

如果json中缺少例如NA,我希望返回col_b,这里json$xyz2$xyz2

现在它只是抛出一个错误:

Error: Column "col_b" must be length 1 or 36, not 0

2 个答案:

答案 0 :(得分:1)

一个选项可能是将NA更改为json本身的一部分,然后创建tibble。以下解决方案适用于我的toy列表。

library(tidyverse)
#First find max length in items of json
max_length <- max(sapply(json,length))

#Set length of each items so that `NA` is included 
json<- lapply(json, function(x){
  length(x)<-max_length
  x
  })

#Now cerate tibble
my_tibble <- tibble(col_a = json$xyz$xyz,
                    col_b = json$xyz2$xyz2,
                    col_c = json$xyz3)

OP可以共享json的详细信息,以便可以针对此解决方案进行验证。

答案 1 :(得分:0)

好的,我找到了解决问题的方法,这可能不是最优雅的解决方案,但至少很容易实现:

NAfy <- function(x){
  if_else(is.null(x), NA, x)
}

my_tibble <- tibble(col_a = NAfy(json$xyz$xyz),
                    col_b = NAfy(json$xyz2$xyz2),
                    col_c = NAfy(json$xyz3))

现在有用的是不为每一列复制粘贴此函数,但这是另一次。