Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将R中的矩阵/数据帧转换为带有一些约束的JSON对象_Json_R_Matrix_Rjson_Rjsonio - Fatal编程技术网

将R中的矩阵/数据帧转换为带有一些约束的JSON对象

将R中的矩阵/数据帧转换为带有一些约束的JSON对象,json,r,matrix,rjson,rjsonio,Json,R,Matrix,Rjson,Rjsonio,重述: 我必须将R中的矩阵转换为JSON对象,其中包含一些结构。我正在使用rjson软件包。通过一个例子,让我来说明我想要什么。我的具体案例是R中推荐系统代码的输出,其中X2 X3是与特定项目X1最接近的两个项目。此外,X4,X5是与该行的(X1,X2)和(X1,X3)相关联的相似性分数。我希望每个项目的所有推荐项目都是JSON对象,每个项目及其推荐的JSON对象-项目都是更大的JSON对象。分数也应该合并到JSON结构中 让我通过一个例子来解释 假设我有一个矩阵 X1 X2 X3 X4 X5

重述:

我必须将R中的矩阵转换为JSON对象,其中包含一些结构。我正在使用rjson软件包。通过一个例子,让我来说明我想要什么。我的具体案例是R中推荐系统代码的输出,其中X2 X3是与特定项目X1最接近的两个项目。此外,X4,X5是与该行的(X1,X2)和(X1,X3)相关联的相似性分数。我希望每个项目的所有推荐项目都是JSON对象,每个项目及其推荐的JSON对象-项目都是更大的JSON对象。分数也应该合并到JSON结构中

让我通过一个例子来解释

假设我有一个矩阵

X1 X2 X3 X4 X5 
1 22 23  0.8 0.5
34 4 87  0.4 0.4
23 7 92  0.6 0.5
我希望每个项目都有一个JSON结构(每行每个X1),以及推荐的项目和每个组合的相似性分数,作为一个单独的JSON实体,并按顺序完成。我不希望整个JSON对象包含这些单独的JSON对象。 假设还有一个名为“coid”的实体将作为代码的输入。我假设它是XYZ,所有行都是一样的

{ "_id" : { "coid" : "XYZ", "iid" : "1"}, "items" : [ { "item" : "22", "score" : 0.8},{ "item": "23", "score" : 0.5}] }
{ "_id" : { "coid" : "XYZ", "iid" : "34"},"items" : [ { "item" : "4", "score" : 0.4},{ "item": "87", "score" : 0.4}] }
{ "_id" : { "coid" : "XYZ", "iid" : "23"},"items" : [ { "item" : "7", "score" : 0.6},{ "item": "92", "score" : 0.5}] }
如上所述,每个实体都是一个有效的JSON结构/对象,但它们并不是作为一个整体放在一个单独的JSON对象中

我非常感谢对前面问题所做的所有帮助,但不知何故,我觉得我这里的新修改与它们无关,因为最后,如果你做一个toJSON(某个实体),那么它会将整个东西转换成一个JSON对象。我不想那样。 我希望像这样的单个文件被写入一个文件

对于我的无知和不便,我深表歉意。请帮忙。
谢谢。

所需的json对象不是有效的。在将data.frame转换为json对象之前,应该先将其转换为列表。例如,您可以执行以下操作:

cat(toJSON(apply(dat,1,function(x)list(item =unname(x[1]),
                                       Recos=unname(x[-1])))))

[
 {
 "item": 1,
"Recos": [ 22, 23 ] 
},
{
 "item": 34,
"Recos": [ 4, 87 ] 
},
{
 "item": 23,
"Recos": [ 7, 92 ] 
} 
]

首先,您的json是无效的。例如,您可以检查有效性

也就是说,要获得类似于所需json输出的东西,您可以按f

library(RJSONIO)

# recreating your matrix
m <- matrix(c(1,22,23,34,4,87,23,7,92),nrow=3,byrow=T)
colnames(m)<-c('X1','X2','X3')

# convert numeric matrix to character (if necessary)
m <- matrix(as.character(m),nrow=nrow(m))

# transform your matrix before turning into json    
p <- apply(m,MARGIN=1,FUN=function(r)list(Item=unname(r[1]),Recos=unname(r[-1])))

# jsonize
toJSON(p)

编辑(根据您的编辑):

library(RJSONIO)

# recreating your matrix
m <- matrix(c(1,22,23,34,4,87,23,7,92),nrow=3,byrow=T)
colnames(m)<-c('X1','X2','X3')

# transform your matrix before turning into json    
p <- apply(m,MARGIN=1,
           FUN=function(r){
             list(itemID=unname(r[1]),
                  recommendedItems=lapply(unname(r[-1]),
                                          FUN=function(i)list(itemID=i)))
           })

# jsonize
toJSON(p)

编辑2:

library(RJSONIO)

# recreating your matrix
m <- matrix(c(1,22,23,34,4,87,23,7,92),nrow=3,byrow=T)
colnames(m)<-c('X1','X2','X3')

# transform your matrix before turning into json    
p <- apply(m,MARGIN=1,
           FUN=function(r){
             list(itemID=unname(r[1]),
                  recommendedItems=lapply(unname(r[-1]),
                                          FUN=function(i)list(itemID=i)))
           })

# jsonize
toJSON(p)
与其为您编写代码,我更愿意解释RJSONIO包如何将R结构转换为json

关于JSON转换,我考虑对象的3种“类型”:

  • 未命名列表(或向量)
  • 命名列表(或向量)
  • 一元向量

  • 1)元素的未命名列表(或向量)(例如
    v您需要创建适当的嵌套列表

    m <- matrix(c(1,22,23,34,4,87,23,7,92),nrow=3,byrow=T)
    colnames(m)<-c('X1','X2','X3')
    
    m1 <- apply(m,1, function(x) {
         list(itemID = unname(x[1]), 
              recommendedItems = lapply(unname(x[2:3]), function(y) {
                 list(itemID = y)}
              ))
           })
    
    
     cat(toJSON(m1))
    [
      {
        "itemID":      1,
        "recommendedItems": [
          {
            "itemID":     22 
          },
          {
            "itemID":     23 
          } 
        ] 
      },
    {
        "itemID":     34,
        "recommendedItems": [
          {
            "itemID":      4 
          },
          {
            "itemID":     87 
          } 
        ] 
      },
    {
        "itemID":     23,
        "recommendedItems": [
          {
            "itemID":      7 
          },
          {
            "itemID":     92 
          } 
        ] 
      } 
    ]
    

    m问题已被编辑。请帮助我如何制作我所要求的新JSON结构。@user2878729:检查我的编辑。顺便说一句,试着了解JSON是如何从R结构开始生成的。这非常简单;)我们能为每一行独立地生成单独的JSON对象吗?例如:我再次编辑了我的问题。对此我非常抱歉。请仔细阅读并帮助我。@user2878729:Stackoverflow不是一个你可以要求用户为你编写代码的地方,而是一个你可以学习如何解决自己问题的地方。根据这个想法,我发布了一篇关于RJSONIO如何工作的描述。我相信在阅读了我的解释之后,你将能够完成你的任务;)该问题已被编辑。请帮助我如何制作我所要求的新JSON结构。谢谢
    
    [ element_1, element_2, element_3, ... ]
    
    { "name_1": value_1, "name_2": value_2, ...  }
    
    toJSON(list(list(A=2),1:3))
    > '[ { "A": 2 }, [ 1, 2, 3 ] ]'
    
    toJSON(list(A=list(1),B=list(C="X"),D=1))
    > '{ "A": [ 1 ], "B": { "C": "X" }, "D": 1 }'
    
    m <- matrix(c(1,22,23,34,4,87,23,7,92),nrow=3,byrow=T)
    colnames(m)<-c('X1','X2','X3')
    
    m1 <- apply(m,1, function(x) {
         list(itemID = unname(x[1]), 
              recommendedItems = lapply(unname(x[2:3]), function(y) {
                 list(itemID = y)}
              ))
           })
    
    
     cat(toJSON(m1))
    [
      {
        "itemID":      1,
        "recommendedItems": [
          {
            "itemID":     22 
          },
          {
            "itemID":     23 
          } 
        ] 
      },
    {
        "itemID":     34,
        "recommendedItems": [
          {
            "itemID":      4 
          },
          {
            "itemID":     87 
          } 
        ] 
      },
    {
        "itemID":     23,
        "recommendedItems": [
          {
            "itemID":      7 
          },
          {
            "itemID":     92 
          } 
        ] 
      } 
    ]