将字符列表转换为数据框

时间:2014-01-31 21:24:57

标签: r dataframe numeric rjson

我在JSON中有一些数据我想在R中使用。我的问题是我无法以正确的格式获取数据。

require(RJSONIO)

json <- "[{\"ID\":\"id1\",\"VALUE\":\"15\"},{\"ID\":\"id2\",\"VALUE\":\"10\"}]"
example <- fromJSON(json)

example <- do.call(rbind,example)
example <- as.data.frame(example,stringsAsFactors=FALSE)

> example
   ID VALUE
1 id1    15
2 id2    10

这很接近,但我无法将数字列转换为数字。我知道我可以手动转换列,但我认为data.frameas.data.frame扫描了数据并制作了最合适的类定义。显然我误解了。我在很多表中阅读 - 都非常不同 - 我需要将数字数据当作数字处理。

最终,我希望在数据为数字时使用数字列获取数据表。

3 个答案:

答案 0 :(得分:4)

read.table使用type.convert将数据转换为适当的类型。在读取JSON数据后,您可以执行与清理步骤相同的操作。

sapply(example,class)
         # ID       VALUE 
# "character" "character" 
example[] <- lapply(example, type.convert, as.is = TRUE)
sapply(example, class)
         # ID       VALUE 
# "character"   "integer" 

答案 1 :(得分:1)

我建议您使用jsonlite软件包,默认情况下将其转换为数据框

jsonlite::fromJSON(json)

   ID VALUE
1 id1    15
2 id2    10

注意:numeric问题仍然存在,因为json没有编码数据类型。因此,您必须手动转换数字列。

答案 2 :(得分:0)

为了跟进Ramnath过渡到jsonlite的建议,我对这两种方法做了一些基准测试:

##RJSONIO vs. jsonlite for a simple example

require(RJSONIO)
require(jsonlite)
require(microbenchmark)

json <- "{\"ID\":\"id1\",\"VALUE\":\"15\"},{\"ID\":\"id2\",\"VALUE\":\"10\"}"
test <- rep(json,1000)
test <- paste(test,collapse=",")
test <- paste0("[",test,"]")

func1 <- function(x){
  temp <- jsonlite::fromJSON(x)
}

func2 <- function(x){
  temp <- RJSONIO::fromJSON(x)
  temp <- do.call(rbind,temp)
  temp <- as.data.frame(temp,stringsAsFactors=FALSE)
}

> microbenchmark(func1(test),func2(test))
Unit: milliseconds
       expr       min        lq    median        uq       max neval
func1(test) 204.05228 221.46047 233.93321 246.90815 341.95684   100
func2(test)  21.60289  22.36368  22.70935  23.75409  27.41851   100

至少就目前而言,我知道jsonlite包仍然是新的,并且专注于性能的准确性,旧的RJSONIO在这个简单的例子中表现得更快 - 即使将列表转换为数据帧也是如此。 / p>

更新包括rjson

require(rjson)

func3 <- function(x){
  temp <- rjson::fromJSON(x)
  temp <- do.call(rbind,lapply(temp,unlist))
  temp <- as.data.frame(temp,stringsAsFactors=FALSE)
}

> microbenchmark(func1(test),func2(test),func3(test))
Unit: milliseconds
       expr       min        lq    median        uq       max neval
func1(test) 205.34603 220.85428 234.79492 249.87628 323.96853   100
func2(test)  21.76972  22.67311  23.11287  23.56642  32.97469   100
func3(test)  14.16942  15.96937  17.29122  20.19562  35.63004   100

> microbenchmark(func1(test),func2(test),func3(test),times=500)
Unit: milliseconds
       expr       min        lq    median        uq       max neval
func1(test) 206.48986 225.70693 241.16301 253.83269 336.88535   500
func2(test)  21.75367  22.53256  23.06782  23.93026 103.70623   500
func3(test)  14.21577  15.61421  16.86046  19.27347  95.13606   500

> identical(func1(test),func2(test)) & identical(func1(test),func3(test))
[1] TRUE

至少在我的机器rjson上只有稍微更快,虽然我没有测试它与RJSONIO相比如何缩放,这可能是它获得巨大性能提升的地方拉姆纳斯建议道。