2017-04-17 57 views
1

我试图用从API中拉出的列表中的NAs替换NULL值,但长度不同,因此无法替换。不适用于替换列表中的NULL/for循环

我已经尝试在toxboot包(找到here)中使用nullToNA函数,但是当我试图调用它时,它不会在R中找到该函数(我不知道是否有更改我找不到或者是因为列表不是从MongoDB中提取的)。我也尝试了所有函数调用检查here。我的代码如下。任何帮助?

library(httr) 
library(toxboot) 
library(RJSONIO) 
library(lubridate) 
library(xlsx) 
library(reshape2) 

resUrl <- "http://api.eia.gov/series/?api_key=2B5239FA427673D22505DBF45664B12E&series_id=NG.N3010CO3.M" 

comUrl <- "http://api.eia.gov/series/?api_key=2B5239FA427673D22505DBF45664B12E&series_id=NG.N3020CO3.M" 

indUrl <- "http://api.eia.gov/series/?api_key=2B5239FA427673D22505DBF45664B12E&series_id=NG.N3035CO3.M" 

apiList <- list(resUrl, comUrl, indUrl) 

results <- vector("list", length(apiList)) 

for(i in length(apiList)){ 
    raw <- GET(url = as.character(apiList[i])) 
    char <- rawToChar(raw$content) 
    list <- fromJSON(char) 
    for (j in length(list$series[[1]]$data)){ 
     if (is.null(list$series[[1]]$data[[j]][[2]])== TRUE) 
     ##nullToNA(list$series[[1]]$data[[j]][[2]]) 
     ##list$series[1]$data[[j]][[2]] <- NA 
     else 
     next 
    } 
    ##seriesData <- list$series[[1]]$data 
    unlistResult <- lapply(list, unlist) 
    ##unlistResult <- lapply(seriesData, unlist) 
    ##unlist2 <- lapply(unlistResult,unlist) 
    ##results[[i]] <- unlistResult 
    results[[i]] <- unlistResult 
} 

我的主题标签有一些我尝试过的东西。但还有其他一些我没有尝试过的方法。我已经看过lapply(list,function(x)ifelse(x ==“NULL”,NA,x)),但没有任何运气。

+0

I th墨水在“显示您在项目中某处使用的所有库”和“显示与此[最小示例](http://stackoverflow.com/help/mcve)相关的库”之间有一个平衡。我相信你不需要包含'openxlsx','lubridate'或'reshape2'。另外,我建议你可以使用'httr :: content()'并且否定'fromJSON'和'rawToChar'的显式使用,但也许我错过了一些东西。 – r2evans

回答

2

试试这个:

library(httr) 
resUrl <- "http://api.eia.gov/series/?api_key=2B5239FA427673D22505DBF45664B12E&series_id=NG.N3010CO3.M" 
x <- GET(resUrl) 
y <- content(x) 
str(head(y$series[[1]]$data)) 
# List of 6 
# $ :List of 2 
# ..$ : chr "201701" 
# ..$ : NULL 
# $ :List of 2 
# ..$ : chr "201612" 
# ..$ : num 6.48 
# $ :List of 2 
# ..$ : chr "201611" 
# ..$ : num 7.42 
# $ :List of 2 
# ..$ : chr "201610" 
# ..$ : num 9.75 
# $ :List of 2 
# ..$ : chr "201609" 
# ..$ : num 12.1 
# $ :List of 2 
# ..$ : chr "201608" 
# ..$ : num 14.3 

在这第一个URL,仅在$series[[1]]$data第一含有NULL。顺便说一句:清楚区分NULL(文字)和"NULL"(一个character字符串与4个字母)。

这里有一些方法(用不同的数据类型)来检查NULL S:

is.null(NULL) 
# [1] TRUE 
length(NULL) 
# [1] 0 

够简单了,到目前为止,我们尝试用NULL s到列表:

l <- list(NULL, 1) 
is.null(l) 
# [1] FALSE 
sapply(l, is.null) 
# [1] TRUE FALSE 
length(l) 
# [1] 2 
lengths(l) 
# [1] 0 1 
sapply(l, length) 
# [1] 0 1 

(其中“ 0“的长度表示NULL s)。我将在这里使用lengths

y$series[[1]]$data <- lapply(y$series[[1]]$data, function(z) { z[ lengths(z) == 0 ] <- NA; z; }) 
str(head(y$series[[1]]$data)) 
# List of 6 
# $ :List of 2 
# ..$ : chr "201701" 
# ..$ : logi NA 
# $ :List of 2 
# ..$ : chr "201612" 
# ..$ : num 6.48 
# $ :List of 2 
# ..$ : chr "201611" 
# ..$ : num 7.42 
# $ :List of 2 
# ..$ : chr "201610" 
# ..$ : num 9.75 
# $ :List of 2 
# ..$ : chr "201609" 
# ..$ : num 12.1 
# $ :List of 2 
# ..$ : chr "201608" 
# ..$ : num 14.3 
+1

非常感谢您的帮助和详细的解释,这非常有帮助。这真的简化了我的代码。 – Sammy