2013-10-04 120 views
0

我有這樣一個數據幀:如何將數據幀轉換爲JSON格式中的R

dput(y) 
structure(list(Name = c("Logon", "Logon", "Logon", "Logon", "Logon", 
"Logon", "Logon", "Logon", "Logon", "Logon", "Logon", "Logon", 
"Logon", "Logon", "Logon", "Logon", "Logon", "Logon", "Logon", 
"Logon"), MONTH = structure(c(15002, 15033, 15061, 15092, 15122, 
15153, 15183, 15214, 15245, 15275, 15306, 15336, 15367, 15398, 
15427, 15458, 15488, 15519, 15549, 15580), class = "Date"), TOTAL = c(284697404L, 
268944957L, 297847827L, 287150001L, 277779620L, 262275285L, 284271058L, 
294965702L, 285132804L, 238847338L, 242683830L, 314483537L, 324823553L, 
322896485L, 329044914L, 318228530L, 324395065L, 324988644L, 335464023L, 
336269471L)), .Names = c("Name", "MONTH", "TOTAL"), row.names = c(3755L, 
2875L, 3393L, 13558L, 14278L, 11991L, 12300L, 13040L, 47341L, 
36813L, 44897L, 46836L, 37038L, 46086L, 37261L, 37445L, 48030L, 
37486L, 38074L, 38818L), class = "data.frame") 

我需要轉換到這個數據幀JSON格式是這樣的:

{"name":"Logon","data":[284697404,268944957,... ]} 

我有這樣的:

servers <- split(y, y$Name) 
dumFun <- function(x){ 
    sData <- servers[x][[1]] 
    if(nrow(sData) >0){ 
    # create appropriate list 
    dumList <- unname(apply(sData[3], 1, function(y) unname(as.list(y)))) 
    return(toJSON(list(name = x, data = dumList))) 
    } 
} 

jsData <- lapply(names(servers), dumFun) 

這覆羽的數據,因爲這:

{"name":"Logon","data":[[284697404],[268944957],[297847827],[287150001],[277779620],[262275285],[284271058],[294965702],[285132804],[238847338],[242683830],[314483537],[324823553],[322896485],[329044914],[318228530],[324395065],[324988644],[335464023],[336269471],[324063033],[349017727],[347193478],[355561387],[373885187],[356774443],[386372600],[387573710],[397346365],[388064866],[397269760],[406584525],[353936952]]}" 

我需要的輸出是這樣的:

{"name":"Logon","data":[284697404,268944957,297847827,287150001],...etc}" 

什麼想法?

回答

1

看起來像data應該只是一個向量而不是列表。您的線路位於:

dumList <- unname(apply(sData[3], 1, function(y) unname(as.list(y)))) 

正在從您的數據的第三列創建一個列表。它改成這樣:

dumList <- unname(apply(sData[3], 1, function(y) unname(y))) 
簡單

甚至並給予同樣的結果:

dumList <- sData[[3]] 

爲了解釋發生了什麼,怎麼看怎麼toJSON轉換一個簡單的載體[1,2,3]而不是相同元素的嵌套列表。

x <- 1:3 
toJSON(x) 
# [ 1, 2, 3 ] 

x_list <- lapply(x, as.list) 
toJSON(x_list) 
# [ [1], [2], [3] ] 

第二種情況是你所看到的。請注意,只是看到您的rjson標籤。我正在使用RJSONIO包。我認爲如果你使用rjson,結果應該是一樣的。

1

您的toJSON列表有點偏離。它需要命名的向量列表。

重要:
當組合名單,

使用:c(list1, list2)
不是這個:list(list1, list2)

後者將創建嵌套的附加水平,這是不是你想要的。

這裏是一個快速的方式去獲取JSON字符串:

# for syntax ease 
library(data.table) 


as.data.table(y)[ 
    # the outer `list` is for data.table, the inner `lists` are for `JSON` 
    , list(JSON = toJSON(c(list(name=Name), list(data=TOTAL)))), by=Name][, JSON] 

[1] "{\"name\":\"Logon\",\"data\":[284697404,268944957,297847827,287150001,277779620,262275285,284271058,294965702,285132804,238847338,242683830,314483537,324823553,322896485,329044914,318228530,324395065,324988644,335464023,336269471]}" 
相關問題