1

重新编辑:

我必须将 R 中的矩阵转换为具有某些结构的 JSON 对象。我正在使用 rjson 包。通过一个例子,让我说明我想要什么。我的具体情况是 R 中推荐系统代码的输出,其中 X2 X3 是与特定项目 X1 最接近的 2 个项目。此外,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 对象。假设还有一个名为“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 对象. 我不想要那个。我希望将像这样的单个文件写入文件。

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

4

3 回答 3

2

首先,您的 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)

结果:

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

编辑(根据您的编辑):

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)

结果:

[{
        "itemID" : 1,
        "recommendedItems" : [{
                "itemID" : 22
            }, {
                "itemID" : 23
            }
        ]
    }, {
        "itemID" : 34,
        "recommendedItems" : [{
                "itemID" : 4
            }, {
                "itemID" : 87
            }
        ]
    }, {
        "itemID" : 23,
        "recommendedItems" : [{
                "itemID" : 7
            }, {
                "itemID" : 92
            }
        ]
    }
]

编辑 2:

与其为你写代码,我更愿意尝试解释一个 R 结构是如何通过 RJSONIO 包变成一个 json 的。

就 json 转换而言,我考虑了 3 种“类型”的对象:

  1. 未命名列表(或向量)
  2. 命名列表(或向量)
  3. 一个元素的向量

1)元素(例如 )的未命名列表(或向量)v <- list('a','b','c')被转换为 json 为:

[ element_1, element_2, element_3, ... ]

是列表的element_n第 n 个元素。当然,列表的每个元素都可以是另一个复杂的对象,按照我在这里描述的 3 条规则转换为 json。

2)一个命名列表(或向量)(例如n <- list(A="foo",B="bar")),被翻译成json为:

{ "name_1": value_1, "name_2": value_2, ...  }

withname_n是命名列表的第 n 个元素的名称,以及命名列表value_1的第 n 个元素的值。当然,命名列表的每个值都可以是另一个复杂对象,按照我在这里描述的 3 条规则转换为 json。

3)正如您正确指出的那样,R 中的每个对象都是一个向量。Evena <- 1是一个元素的数值向量。因此,按照前面的 2 条规则,您会期望例如list(x=1)被翻译为{ "x" : [ 1 ] }. 但是由于函数的参数asIs(默认为 FALSE ),单个元素的toJSON向量(而不是列表)被认为是标量。

话虽如此,以下是一些示例:

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 }'
于 2014-07-19T13:27:41.927 回答
0

所需的 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 ] 
} 
]
于 2014-07-19T13:27:01.870 回答
0

您需要创建适当的嵌套列表

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 
      } 
    ] 
  } 
]
于 2014-07-21T05:48:22.157 回答