我试图找出生产从R.我有以下的数据帧一个JSON文件的最好方式tmp在R。
tmp
R
> tmp gender age welcoming proud tidy unique 1 1 30 4 4 4 4 2 2 34 4 2 4 4 3 1 34 5 3 4 5 4 2 33 2 3 2 4 5 2 28 4 3 4 4 6 2 26 3 2 4 3
的输出dput(tmp)如下:
dput(tmp)
tmp <- structure(list(gender = c(1L, 2L, 1L, 2L, 2L, 2L), age = c(30, 34, 34, 33, 28, 26), welcoming = c(4L, 4L, 5L, 2L, 4L, 3L), proud = c(4L, 2L, 3L, 3L, 3L, 2L), tidy = c(4L, 4L, 4L, 2L, 4L, 4L), unique = c(4L, 4L, 5L, 4L, 4L, 3L)), .Names = c("gender", "age", "welcoming", "proud", "tidy", "unique"), na.action = structure(c(15L, 39L, 60L, 77L, 88L, 128L, 132L, 172L, 272L, 304L, 305L, 317L, 328L, 409L, 447L, 512L, 527L, 605L, 618L, 657L, 665L, 670L, 708L, 709L, 729L, 746L, 795L, 803L, 826L, 855L, 898L, 911L, 957L, 967L, 983L, 984L, 988L, 1006L, 1161L, 1162L, 1224L, 1245L, 1256L, 1257L, 1307L, 1374L, 1379L, 1386L, 1387L, 1394L, 1401L, 1408L, 1434L, 1446L, 1509L, 1556L, 1650L, 1717L, 1760L, 1782L, 1814L, 1847L, 1863L, 1909L, 1930L, 1971L, 2004L, 2022L, 2055L, 2060L, 2065L, 2082L, 2109L, 2121L, 2145L, 2158L, 2159L, 2226L, 2227L, 2281L ), .Names = c("15", "39", "60", "77", "88", "128", "132", "172", "272", "304", "305", "317", "328", "409", "447", "512", "527", "605", "618", "657", "665", "670", "708", "709", "729", "746", "795", "803", "826", "855", "898", "911", "957", "967", "983", "984", "988", "1006", "1161", "1162", "1224", "1245", "1256", "1257", "1307", "1374", "1379", "1386", "1387", "1394", "1401", "1408", "1434", "1446", "1509", "1556", "1650", "1717", "1760", "1782", "1814", "1847", "1863", "1909", "1930", "1971", "2004", "2022", "2055", "2060", "2065", "2082", "2109", "2121", "2145", "2158", "2159", "2226", "2227", "2281"), class = "omit"), row.names = c(NA, 6L), class = "data.frame")
使用该rjson包,我运行toJSON(tmp)生成以下JSON文件的行:
rjson
toJSON(tmp)
{"gender":[1,2,1,2,2,2], "age":[30,34,34,33,28,26], "welcoming":[4,4,5,2,4,3], "proud":[4,2,3,3,3,2], "tidy":[4,4,4,2,4,4], "unique":[4,4,5,4,4,3]}
我还尝试了该RJSONIO程序包;的输出toJSON()是相同的。我想产生的是以下结构:
RJSONIO
toJSON()
{"traits":["gender","age","welcoming","proud", "tidy", "unique"], "values":[ {"gender":1,"age":30,"welcoming":4,"proud":4,"tidy":4, "unique":4}, {"gender":2,"age":34,"welcoming":4,"proud":2,"tidy":4, "unique":4}, .... ]
我不确定如何做到最好。我意识到我可以使用逐行解析它,python但是我觉得这样做可能是更好的方法。我还意识到我的数据结构R不能反映JSON文件中所需的元信息(特别是该traits行),但是我主要对产生像该行一样格式的数据感兴趣
python
JSON
traits
{"gender":1,"age":30,"welcoming":4,"proud":4,"tidy":4, "unique":4}
因为我可以手动添加第一行。
编辑:我发现了一个有用的博客文章,作者在其中处理了类似的问题并提供了解决方案。此函数从数据帧生成格式化的JSON文件。
toJSONarray <- function(dtf){ clnms <- colnames(dtf) name.value <- function(i){ quote <- ''; # if(class(dtf[, i])!='numeric'){ if(class(dtf[, i])!='numeric' && class(dtf[, i])!= 'integer'){ # I modified this line so integers are also not enclosed in quotes quote <- '"'; } paste('"', i, '" : ', quote, dtf[,i], quote, sep='') } objs <- apply(sapply(clnms, name.value), 1, function(x){paste(x, collapse=', ')}) objs <- paste('{', objs, '}') # res <- paste('[', paste(objs, collapse=', '), ']') res <- paste('[', paste(objs, collapse=',\n'), ']') # added newline for formatting output return(res) }
使用包jsonlite:
jsonlite
> jsonlite::toJSON(list(traits = names(tmp), values = tmp), pretty = TRUE) { "traits": ["gender", "age", "welcoming", "proud", "tidy", "unique"], "values": [ { "gender": 1, "age": 30, "welcoming": 4, "proud": 4, "tidy": 4, "unique": 4 }, { "gender": 2, "age": 34, "welcoming": 4, "proud": 2, "tidy": 4, "unique": 4 }, { "gender": 1, "age": 34, "welcoming": 5, "proud": 3, "tidy": 4, "unique": 5 }, { "gender": 2, "age": 33, "welcoming": 2, "proud": 3, "tidy": 2, "unique": 4 }, { "gender": 2, "age": 28, "welcoming": 4, "proud": 3, "tidy": 4, "unique": 4 }, { "gender": 2, "age": 26, "welcoming": 3, "proud": 2, "tidy": 4, "unique": 3 } ] }