2012-01-30 2 views
0

Я хочу преобразовать следующий json и поместить значения в фрейм данных. Он почти работает, но as.data.frame() помещает все в одну строку.Разделить и преобразовать строку символов R в числовой вектор

require(rjson) 
require(RCurl) 

y = getURI(url1) 
y 
[1] "[{\"close\":5.45836392962902,\"highest\":5.45837200714172,\"lowest\":5.45836392962902,\"open\":5.45837200714172,\"start_time\":\"2012-01-29T18:29:24-08:00\"},{\"close\":5.45837200714172,\"highest\":5.45837200714172,\"lowest\":5.45834791002201,\"open\":5.45835598753471,\"start_time\":\"2012-01-29T18:28:24-08:00\"}]" 

x = fromJSON(y) 
> str(x) 
List of 2 
$ :List of 5 
    ..$ close  : num 5.46 
    ..$ highest : num 5.46 
    ..$ lowest : num 5.46 
    ..$ open  : num 5.46 
    ..$ start_time: chr "2012-01-29T18:29:24-08:00" 
$ :List of 5 
    ..$ close  : num 5.46 
    ..$ highest : num 5.46 
    ..$ lowest : num 5.46 
    ..$ open  : num 5.46 
    ..$ start_time: chr "2012-01-29T18:28:24-08:00" 

as.data.frame(x) 
    close highest lowest  open    start_time close.1 highest.1 lowest.1 open.1    start_time.1 
1 5.458364 5.458372 5.458364 5.458372 2012-01-29T18:29:24-08:00 5.458372 5.458372 5.458348 5.458356 2012-01-29T18:28:24-08:00 

Вместо того, чтобы быть на одном ряду. Я хочу их в два ряда.

close highest lowest  open    start_time 
1 5.458364 5.458372 5.458364 5.458372 2012-01-29T18:29:24-08:00 
2 5.458372 5.458372 5.458348 5.458356 2012-01-29T18:28:24-08:00 

Есть ли что-то, что я могу указать в as.data.table для этого?

РЕДАКТИРОВАТЬ:

do.call(rbind,lapply(x,as.data.frame)) 

Выше был в состоянии заставить его в кадр данных, но столбец метки времени имеет два фактора. Это следующая часть имеет свой собственный вопрос here

y = do.call(rbind,lapply(x,as.data.frame)) 
str(x) 
'data.frame': 2 obs. of 5 variables: 
$ close  : num 5.46 5.46 
$ highest : num 5.47 5.46 
$ lowest : num 5.46 5.46 
$ open  : num 5.46 5.46 
$ start_time: Factor w/ 2 levels "2012-01-29T21:48:24-05:00",..: 1 2 

Если я пытаюсь преобразовать формат POSIX я получаю

x$start_time = as.POSIXct(x$start_time) 
x$start_time 
[1] "2012-01-29 CST" "2012-01-29 CST" 

Но он теряет данные времени.

ответ

2

Вы можете попробовать:

do.call(rbind,lapply(x,as.data.frame)) 
+0

Колонка start_time имеет 2 фактора, когда я делаю так. Любая идея, как получить его в формате POSIX? – Kevin

+0

@Kevin 'as.POSIXct'? 'As.POSIXlt'? Читайте и выбирайте. – joran

+0

Я пробовал. Даты правильные, но, похоже, они вычеркивают время. Когда я использую as.POSIXlt, это дает мне неправильное время. – Kevin

Смежные вопросы