2017-12-31 159 views
1

첫 번째 질문과 R, json 데이터 및 API에 대한 3 일간의 경험이있는이 포럼의 새로운 기능, 어떤 순진이라도 변명 해주세요. 그러나, 이것을 배우는 것에 정말로 흥분한다 !!json 파일을 데이터 프레임으로 변환하려고 할 때 "오류 : 인수가 다른 행 수 : 1, 0을 의미 함"

json 데이터를 다음 API 끝점에서 사용 가능한 데이터 프레임으로 변환하려고합니다. 다음은 json에 대한 링크입니다. https://api.binance.com/api/v1/depth?symbol=ETHBTC. 나는이 작업을 수행하기 위해 다음과 같은 코드를 사용하고 (간체) :

디버깅에
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : 
    arguments imply differing number of rows: 1, 0** 

, 오류가, 마지막 줄의 첫 번째 때문에 가능성이 높습니다 :

library(jsonlite) 
library(httr) 

endpoint <- "https://api.binance.com/api/v1/depth?symbol=ETHBTC" 
dt_text <- content(GET(endpoint), "text") 
dt_json <- fromJSON(dt_text, flatten = TRUE) 
df_GetDepth <- as.data.frame(dt_json) 

는 그러나, 나는이 오류가 무엇입니까 json 데이터의 열에는 하나의 항목 만 있지만 다른 열에는 더 많은 항목이있는 것으로 나타납니다. 또한 json 데이터의 요약 스 니펫이 첨부되어 있습니다.

{ 
    "lastUpdateId": 1027024, 
    "bids": [ 
    [ 
     "4.00000000",  // PRICE 
     "431.00000000", // QTY 
     []    // Can be ignored 
    ] 
    ], 
    "asks": [ 
    [ 
     "4.00000200", 
     "12.00000000", 
     [] 
    ] 
    ] 
} 

정말 전문가의 학습을 기대합니다 !! 데이터의 서브 세트를 사용

는 디트

답변

0

("lastUpdateId"를 생략하고 단지 "asks""bids" 각각의 처음 세) 중 하나를 사용, rbind 한창를

dt2 <- lapply(dt_json, head, 3)[c("bids","asks")] 
dt2 <- structure(list(bids = list(list("0.05309400", "8.00000000", character(0)), 
    list("0.05308800", "25.79300000", character(0)), list("0.05308600", 
     "8.25500000", character(0))), asks = list(list("0.05317900", 
    "0.15500000", character(0)), list("0.05319400", "0.04100000", 
    character(0)), list("0.05319600", "1.50000000", character(0)))), .Names = c("bids", 
"asks")) 

str(dt2) 
# List of 2 
# $ bids:List of 3 
# ..$ :List of 3 
# .. ..$ : chr "0.05309400" 
# .. ..$ : chr "8.00000000" 
# .. ..$ : chr(0) 
# ..$ :List of 3 
# .. ..$ : chr "0.05308800" 
# .. ..$ : chr "25.79300000" 
# .. ..$ : chr(0) 
# ..$ :List of 3 
# .. ..$ : chr "0.05308600" 
# .. ..$ : chr "8.25500000" 
# .. ..$ : chr(0) 
# $ asks:List of 3 
# ..$ :List of 3 
# .. ..$ : chr "0.05317900" 
# .. ..$ : chr "0.15500000" 
# .. ..$ : chr(0) 
# ..$ :List of 3 
# .. ..$ : chr "0.05319400" 
# .. ..$ : chr "0.04100000" 
# .. ..$ : chr(0) 
# ..$ :List of 3 
# .. ..$ : chr "0.05319600" 
# .. ..$ : chr "1.50000000" 
# .. ..$ : chr(0) 

첫 단계 일 :

dt3 <- lapply(dt2, function(a) do.call(rbind, lapply(a, function(b) rbind(Filter(length, b))))) 
dt3 
# $bids 
#  [,1]   [,2]   
# [1,] "0.05309400" "8.00000000" 
# [2,] "0.05308800" "25.79300000" 
# [3,] "0.05308600" "8.25500000" 
# $asks 
#  [,1]   [,2]   
# [1,] "0.05317900" "0.15500000" 
# [2,] "0.05319400" "0.04100000" 
# [3,] "0.05319600" "1.50000000" 

그리고는 숫자로 변환 :

dt4 <- lapply(dt3, function(a) t(apply(a, 1, as.numeric))) 
dt4 
# $bids 
#   [,1] [,2] 
# [1,] 0.053094 8.000 
# [2,] 0.053088 25.793 
# [3,] 0.053086 8.255 
# $asks 
#   [,1] [,2] 
# [1,] 0.053179 0.155 
# [2,] 0.053194 0.041 
# [3,] 0.053196 1.500 

이렇게하면 필요한 경우 데이터를 변환하고 열 이름을 적용하기에 충분해야하는 행렬이 만들어집니다.