Получать фрейм данных напрямую из JSON-файла? - PullRequest
3 голосов
/ 30 июня 2011

Во-первых, позвольте мне поблагодарить всех, кто участвует в Stackoverflow и R! Я один из тех R-пользователей, которые не очень хороши в программировании, но смело пытаются использовать его для работы, поэтому проблема ниже, вероятно, тривиальна ...

Вот проблема. Мне нужно импортировать файлы в JSON-формате в R:

# library(plyr)
# library(RJSONIO)
# lstJson <- fromJSON("JSON_test.json")        #This is the file I read
# dput(lstJson)                                              #What I did to get the txtJson below, for the benefit of testing.

txtJson <- structure(list(version = "1.1", result = structure(list(warnings = structure(list(), class = "AsIs"), fields = list(structure(list(info = "", rpl = 15, name = "time", type = "timeperiod"), .Names = c("info", "rpl", "name", "type")), structure(list(info = "", name = "object", type = "string"), .Names = c("info", "name", "type")), structure(list(info = "Counter1", name = "Counter1", type = "int"), .Names = c("info", "name", "type")), structure(list( info = "Counter2", name = "Counter2", type = "int"), .Names = c("info", "name", "type"))), timeout = 180, name = NULL, data = list( list(list("2011-05-01 17:00", NULL), list("Total", NULL), list(8051, NULL), list(44, NULL)), list(list("2011-05-01 17:15", NULL), list("Total", NULL), list(8362, NULL), list( 66, NULL))), type = "AbcDataSet"), .Names = c("warnings", "fields", "timeout", "name", "data", "type"))), .Names = c("version", "result"))

dfJson <- ldply(txtJson, data.frame)  

Мне нужен фрейм данных, похожий на этот:

time  object  Counter1  Counter2  
2011-05-01 17:00  Total  8051  44  
2011-05-01 17:15  Total  8362  66 

Но вместо этого я получаю

"Error in data.frame("2011-05-01 17:00", NULL, check.names = FALSE, stringsAsFactors = TRUE) : 
  arguments imply differing number of rows: 1, 0"

Я получаю ту же ошибку, если использую lstJson.

Я не уверен, что RJSONIO должен быть "достаточно умен", чтобы анализировать подобные файлы, или мне нужно вручную прочитать первую строку файла, установить типы столбцов и т. Д. Причина, по которой я ' я не использую CSV, я хочу "автоматически" получать даты в формате даты и т. д.

Спасибо, / Chris

1 Ответ

6 голосов
/ 30 июня 2011

Рассматривая структуру txtJson, вы видите, что все полезные биты находятся в txtJson $ result $ data:

> sapply( txtJson$result$data, unlist )
     [,1]               [,2]              
[1,] "2011-05-01 17:00" "2011-05-01 17:15"
[2,] "Total"            "Total"           
[3,] "8051"             "8362"            
[4,] "44"               "66"              
> t(sapply( txtJson$result$data, unlist ))
     [,1]               [,2]    [,3]   [,4]
[1,] "2011-05-01 17:00" "Total" "8051" "44"
[2,] "2011-05-01 17:15" "Total" "8362" "66"
> as.data.frame(t(sapply( txtJson$result$data, unlist )) )
                V1    V2   V3 V4
1 2011-05-01 17:00 Total 8051 44
2 2011-05-01 17:15 Total 8362 66

В процессе получения их как не перечисленных векторов и последующей передачи в «as.data.frame» все они теперь являются классом «фактор», поэтому, возможно, потребуются дополнительные усилия для переклассификации () этих значений. Вместо этого вы можете использовать:

data.frame(t(sapply( txtJson$result$data, unlist )) ,stringsAsFactors=FALSE)

И все они будут "персонажем"

Что касается импорта CSV-файлов, аргумент colClasses в read.table () будет принимать "POSIXlt" или "POSIXct" в качестве известных типов. Правило, которое я считаю, заключается в том, что должен быть доступен метод as. _ . Вот минимальный пример:

> read.table(textConnection("2011-05-01 17:00"), sep=",", colClasses="POSIXct")
                   V1
1 2011-05-01 17:00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...