我试图找出从R生成JSON文件的最佳方法。我在R
中有以下 Dataframe tmp
。
> 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
tmp <- data.frame(
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)
)
使用rjson
包,运行toJSON(tmp)
行,生成以下JSON文件:
{"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()
的输出是相同的。我想生成的是以下结构:
{"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
行)中所需的元信息,但我主要感兴趣的是生成格式类似行的数据
{"gender":1,"age":30,"welcoming":4,"proud":4,"tidy":4, "unique":4}
我可以手动添加第一行。
编辑:我发现了一个有用的blog帖子,作者处理了一个类似的问题,并提供了一个解决方案。此函数从 Dataframe 生成格式化的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)
}
5条答案
按热度按时间bq3bfh9z1#
使用
jsonlite
包:5kgi1eie2#
在Andrie的
apply
思想的基础上,您可以在调用toJSON
之前通过修改tmp
变量来获得所需的内容。vm0i2vca3#
在Andrie和Richie的思想的基础上,使用
alply
而不是apply
来避免将数字转换为字符:plyr的
alply
类似于apply
,但会自动返回一个列表;而如果没有Richie Cotton的答案中更复杂的函数,apply
将返回一个向量或数组。这些额外的步骤,包括t
,意味着如果你的数据集有任何非数字列,数字将被转换为字符串。所以使用alply
避免了这种担心。例如,使用
tmp
数据集并添加然后将此代码(使用
alply
)与另一个示例(使用apply
)进行比较。dw1jzc5e4#
在我看来,您可以通过将
data.frame
的每一行发送到JSON中,并使用相应的apply
语句来实现这一点。对于单行:
整个
data.frame
:4ngedf3f5#
另一种选择是使用
split
将具有N行的data.frame
拆分为具有1行的N个data.frames。