我正在使用一个似乎返回格式错误的数据的API。 API应该返回嵌套的数据帧,但有时也会返回空列表:
column_name
<list>
<data.frame [1 × 5]>
<data.frame [0 × 0]>
<data.frame [0 × 0]>
<list [0]>
...
此步骤之后,我想使用unnest
来使用下游嵌套数据帧中的数据。但是,空列表阻止了这种情况的发生。我想到的是:
但是,由于数据框是一个列表,我测试空列表的常用方法已经有些平淡。目前,我正在考虑结合使用identical
或all.equal
与dim
进行测试。即,如果条目的尺寸为[1,1],则将该条目替换为空的数据框。
(我想知道如果我有一个尺寸为[1,1]的数据框,但实际上也有数据...)
这是最R的方式吗?我已经从其他地方的API中看到了这种行为,因此我需要在多个地方使用此功能。
请注意,如果影响答案,我正在使用tidyverse。
答案 0 :(得分:1)
数据帧是特殊的list
,但类是dataframe
。您可以通过以下方式测试课程:
class(data.frame()) == "list"
> FALSE
class(list()) == "list"
> TRUE
答案 1 :(得分:0)
这是使用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()
答案 2 :(得分:0)
从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