填写API导入数据中的缺失值

时间:2014-08-05 15:32:04

标签: r list api missing-data rjson

我正在使用API​​从人口普查局获取数据。好消息是我能够检索数据。坏消息是我无法将其转换为可用于分析和映射的格式。

我的问题:当数据在列表中时,有没有办法修改API调用或处理缺失值的标准方法?

以下是我对实际数据的处理方式。下面是玩具示例,因为人口普查数据需要个人API令牌。

# Pull data from Census Bureau
mydata<-fromJSON(file=url(paste("http://api.census.gov/data/2010/acs5?key=", token,"&get=B25077_001E&for=block+group:*&in=state:47+county:037", sep = ""))) 
# create a data frame
mydata.df<-ldply(mydata)
# rename columns 
names(mydata.df)<-ldply(mydata)[1,] 

这是我的一些数据。我已经尝试了mydata [mydata == NULL] = 9999,但它没有帮助。

   list(c("94400", "47", "037", "019200", "4"), c("350000", "47", "037", "019300", "1"), list(NULL, "47", "037", "019300", "2"), list(NULL, "47", "037", "019300", "3"), c("198200", "47", "037", "019400", "1"), c("176900", "47", "037", "019400", "2"), c("250000", "47", "037", "019400", "3"), c("166200", "47", "037", "019500", "1"), c("227200", "47", "037", "019500", "2"), c("210500", "47", "037", "019500", "3"), c("187500", "47", "037", "019500", "4"), c("140000", "47", "037", "019600", "1"), c("131300", "47", "037", "019600", "2"), list(NULL, "47", "037", "980100", "1"), list(NULL, "47", "037", "980200", "1"))

这就是我知道缺少值的方法;有些有5个值,有些有4个。

unlist(lapply(mydata, function(x) length(unlist(x))))

如果这不是fromJSON()的问题,这里有一个例子,说明我在R中的数据要做的事情。

mylist = list(a = c(1:4), b = c(1:3), c = c(1:4), d = )

给出这个:

$a
[1] 1 2 3 4
$b
[1] 1 2 3
$c 
[1] 1 2 3 4

但我想这样:

$a
[1] 1 2 3 4
$b
[1] 1 2 3 NA
$c 
[1] 1 2 3 4

或类似的地方,NA充当缺失值的占位符。例如,如果缺少2,则列表中的条目将类似于1 NA 3 4。

1 个答案:

答案 0 :(得分:0)

mylist = list(a = 1:4, b = 1:3, c = c(1,3,4))
Un <- unique(unlist(mylist))
lapply(mylist, function(x) x[match(Un,x)])
# $a
# [1] 1 2 3 4

# $b
# [1]  1  2  3 NA

# $c
#[1]  1 NA  3  4

更新

使用dput()数据

 lst1 <- lapply(mylist, function(x) do.call(c,lapply(x, 
                      function(y) {y[is.null(y)] <- NA;y}))) 

   head(lst1,3)
  #[[1]]
  #[1] "94400"  "47"     "037"    "019200" "4"     

  #[[2]]
  #[1] "350000" "47"     "037"    "019300" "1"     

  #[[3]]
  #[1] NA       "47"     "037"    "019300" "2"