JSON形式のURLから利用できるオブジェクトがあり、その一部をデータフレーム形式にしてRでデータを分析したいと考えています。現在、次のようにしています。
# Read data in using fromJSON function
data <- RJSONIO::fromJSON('https://api-prod.footballindex.co.uk/football.allTradable24hrchanges?page=1&per_page=5000&sort=asc')
# The above is an example dataset to use for this question
# In my actual dataset there are fields which only exist in some elements in list so adding this onto example
# I want to handle these by returning in the end dataframe with NA if it doesn't exist
data[['items']][[1]]$newField <- 1
# It is only the data in the items field I am interested in
# Unlist each element to get all nested emelents within the lists in flat format
dataList <- lapply(data[['items']], unlist)
# Combine all elemnts of list together
dataDF <- dplyr::bind_rows(dataList)
# Convert into data.frame
dataDF <- data.frame(dataDF)
これは機能しますが、そのbind_rows
部分には長い時間がかかります
> system.time(dataDF <- dplyr::bind_rows(dataList))
user system elapsed
42.195 0.000 42.216
これを行うためのより迅速な方法が必要なように感じます。
より高速な代替手段であると言われていdata.table::rbindlist
ますが、これを使用するとエラーメッセージが表示されます
> dataDF <- data.table::rbindlist(dataList)
Error in data.table::rbindlist(dataList) :
Item 1 of input is not a data.frame, data.table or list
実行されて高速な回答で使用することを提案しdo.call(rbind...
ましたが、一部の要素にのみ含まれるフィールドがある場合、これは適切に処理されません。例えば
dataDF2 <- data.frame(do.call(rbind, dataList))
> head(dataDF$country)
[1] "Côte d'Ivoire" "Italy" "England" "Scotland" "Germany" "France"
> head(dataDF2$country)
[1] "Côte d'Ivoire" "1.65" "1.62" "FALSE" "2.59" "France"
助けてくれてありがとう