R 区分空列表或空数据框

R 区分空列表或空数据框,r,list,dataframe,R,List,Dataframe,我使用的API似乎返回了格式错误的数据。API应该返回嵌套的数据帧,但有时也会返回空列表: column_name <list> <data.frame [1 × 5]> <data.frame [0 × 0]> <data.frame [0 × 0]> <list [0]> ... 列名称 ... 在这一步之后,我想使用unest来使用

我使用的API似乎返回了格式错误的数据。API应该返回嵌套的数据帧,但有时也会返回空列表:

column_name
<list>
<data.frame [1 × 5]>                
<data.frame [0 × 0]>                
<data.frame [0 × 0]>                
<list [0]>
...
列名称
...
在这一步之后,我想使用
unest
来使用下游嵌套数据帧中的数据。但是,空列表阻止了这种情况的发生。我想做的是:

  • (1) 测试行条目是否为空列表
  • (2) 如果是,则转换为空数据帧;如果没有,请按原样离开
然而,由于数据帧是一个列表,我的测试空列表的go-to方法有点平淡。目前我正在考虑将
idential
all.equal
dim
一起用于测试。也就是说,如果条目的维度为[1,1],则用空数据框替换该条目

(我想知道如果我有一个维度为[1,1]的数据框,但实际上也有数据,会发生什么情况…)

这是最简单的方法吗?我在其他地方的API中看到过这种行为,因此我需要在多个地方使用此功能


注意,如果这会影响答案,我正在使用tidyverse

数据帧是一个特殊的
列表
,但类是
数据帧
。您可以通过以下方式测试该类:

class(data.frame()) == "list"
> FALSE
class(list()) == "list"
> TRUE

这里有一个使用
map
if

library(dplyr)
library(purrr)  
ir %>% mutate(data1=map(data, ~if(is.null(dim(.x))) data.frame() else .x)) %>% 
       unnest(data1)
数据:提供过去可复制的数据总是有用的

ir <- iris %>% group_by(Species) %>% nest()
ir$data[[2]]<-list()
ir%分组依据(物种)%>%nest()

ir$data[[2]]从API获取数据后,通常更容易清理数据。那么接下来的一切都可以依赖于安全的假设

对于本例,创建一个函数,使用API的响应返回格式一致的
tbl
。每个
tbl
都将有相同的列,但是如果它们不在响应中,其中一些列可能会被
NA
填充

library(tidyr)
library(dplyr)

response_to_df <- function(id = NA_real_,
                           country = NA_character_,
                           wealth = NA_real_,
                           ... # Catch extra columns you don't want
                           ) {
  tibble(id = id, country = country, wealth = wealth)
}

prepare_response_df <- function(response) {
  do.call(response_to_df, response)
}

responses <- list(
  tibble(id = 1:2, country = c("US", "DE"), wealth = c(95, 84)),
  list(),
  tibble(id = 3)
)

tibble(res = responses) %>%
  mutate(nicer = lapply(res, prepare_response_df)) %>%
  unnest(nicer)
# # A tibble: 4 x 3
#      id country wealth
#   <dbl> <chr>    <dbl>
# 1     1 US          95
# 2     2 DE          84
# 3    NA NA          NA
# 4     3 NA          NA
library(tidyr)
图书馆(dplyr)
对于测试的
class(data.frame())==“list”
class(list())==“list”
is.data.frame(list())
如何。