如何将所有元素完全提取到数据框中?

时间:2019-12-15 21:20:52

标签: r dataframe

我从API检索一些数据并将其转换为平面结构。

library(httr)

url <- "https://api.carbonintensity.org.uk/intensity/2019-11-25/2019-11-26"

raw_original <- GET(url)

raw <- rawToChar(raw_original$content)

raw <- fromJSON(raw)

api_extr <- do.call("rbind", lapply(raw, data.frame))

起初,一切似乎都很好(一个5列的数据帧):

> head(api_extr)
               from                to intensity.forecast intensity.actual intensity.index
1 2019-11-24T23:30Z 2019-11-25T00:00Z                210              200        moderate
2 2019-11-25T00:00Z 2019-11-25T00:30Z                199              200        moderate
3 2019-11-25T00:30Z 2019-11-25T01:00Z                200              198        moderate
4 2019-11-25T01:00Z 2019-11-25T01:30Z                204              189        moderate
5 2019-11-25T01:30Z 2019-11-25T02:00Z                199              191        moderate
6 2019-11-25T02:00Z 2019-11-25T02:30Z                192              193        moderate

但是,列(intensity)之一实际上是一个数据帧,其中包含另外三列。

> str(api_extr)
'data.frame':   49 obs. of  3 variables:
 $ from     : chr  "2019-11-24T23:30Z" "2019-11-25T00:00Z" "2019-11-25T00:30Z" "2019-11-25T01:00Z" ...
 $ to       : chr  "2019-11-25T00:00Z" "2019-11-25T00:30Z" "2019-11-25T01:00Z" "2019-11-25T01:30Z" ...
 $ intensity:'data.frame':  49 obs. of  3 variables:
  ..$ forecast: int  210 199 200 204 199 192 191 194 197 192 ...
  ..$ actual  : int  200 200 198 189 191 193 197 193 193 194 ...
  ..$ index   : chr  "moderate" "moderate" "moderate" "moderate" ...

我希望数据框有五列,而只有三列。

乍看之下,这似乎微不足道,但问题将在处理数据(即绘制数据)时开始。

如何获得五列?

2 个答案:

答案 0 :(得分:1)

您可以直接将URL传递到fromJSON,然后一步将结果展平。

library(jsonlite)

url <- "https://api.carbonintensity.org.uk/intensity/2019-11-25/2019-11-26"
df <-fromJSON(url, flatten = TRUE)[[1]]

str(df)

'data.frame':   49 obs. of  5 variables:
 $ from              : chr  "2019-11-24T23:30Z" "2019-11-25T00:00Z" "2019-11-25T00:30Z" "2019-11-25T01:00Z" ...
 $ to                : chr  "2019-11-25T00:00Z" "2019-11-25T00:30Z" "2019-11-25T01:00Z" "2019-11-25T01:30Z" ...
 $ intensity.forecast: int  210 199 200 204 199 192 191 194 197 192 ...
 $ intensity.actual  : int  200 200 198 189 191 193 197 193 193 194 ...
 $ intensity.index   : chr  "moderate" "moderate" "moderate" "moderate" ...

答案 1 :(得分:0)

使用cbindas.data.frame,可以将其转换为5列数据。frame

new <- as.data.frame(cbind(api_extr[,1:2], api_extr$intensity))
str(new)