2014-07-19 1 views
1

REDITED :R의 행렬/데이터 프레임을 몇 가지 제약 조건이있는 JSON 객체로 변환합니다.

R의 행렬을 구조가있는 JSON 객체로 변환해야합니다. rjson 패키지를 사용하고 있습니다. 예를 통해 내가 원하는 것을 설명해 드리겠습니다. 내 구체적인 경우는 추천 시스템 코드 R의 출력입니다. 여기서 X2 X3은 특정 항목 X1에 가장 가까운 2 개의 항목입니다. 또한 X4, X5는 해당 행에 대해 (X1, X2) 및 (X1, X3)과 연관된 유사성 점수입니다. 나는 모든 항목에 대한 모든 권장 항목을 JSON 객체로, 모든 항목을 권장 JSON 객체 항목과 함께 더 큰 JSON 객체로 원한다. 점수는 JSON 구조에도 통합되어야한다.

예제를 통해 설명하겠습니다. I 매트릭스 있다고 가정

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 

는 I 별도 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 객체로 나는 그것을 원하지 않는다. 나는 이것들과 같은 개개의 것들을 파일에 쓰길 원한다.

불편을 끼쳐 드려 죄송합니다. 도와주세요. 감사합니다. .

답변

0

원하는 json 개체가 유효하지 않습니다. json 객체로 변환하기 전에 data.frame을 목록으로 변환해야합니다. 예를 들면 다음과 같습니다.

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 ] 
} 
] 
+0

문제가 수정되었습니다 만들어야합니다. 내가 요청한 새로운 JSON 구조를 만드는 방법을 알려주세요. 감사. – user2878729

1

우선 json이 유효하지 않습니다. 예 : here의 유효성을 확인할 수 있습니다.말했다되고 그건

, 당신은 할 수있는, 원하는 JSON 출력과 비슷한 무언가를 얻기 위해 같은

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) 

F 결과 :

편집

[ 
    { 
     "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) 
,210

결과 :

[{ 
     "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. 벡터 하나 개의 요소
  4. 의 요소 (예를 v <- list('a','b','c'))의

1) 무명 목록 (또는 벡터)로서 JSON으로 변환된다

01,235,
[ element_1, element_2, element_3, ... ] 

element_n은 목록의 n 번째 요소입니다. 물론 목록의 각 요소는 여기에서 설명하는 3 가지 규칙에 따라 json으로 바뀌는 다른 복합 개체 일 수 있습니다.

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

name_n 지정된리스트의 n 번째 원소의 이름 인 상태와 :

2) 명명 목록 (또는 벡터) (예 n <- list(A="foo",B="bar"))는 같은 JSON으로 번역 value_1은 명명 된 목록의 n 번째 요소 값입니다. 물론 명명 된 목록의 각 값은 여기서 설명하는 3 가지 규칙에 따라 json으로 변환되는 또 다른 복잡한 객체가 될 수 있습니다.

3) 올바르게 지적했듯이 R의 모든 객체는 벡터입니다. 심지어 a <- 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 }' 
+0

질문이 수정되었습니다. 내가 요청한 새로운 JSON 구조를 만드는 방법을 알려주세요. – user2878729

+0

@ user2878729 : 내 편집을 확인하십시오. BTW는 json이 R 구조에서 시작하여 어떻게 생성되는지 이해하려고 시도합니다. 정말 쉽습니다;) – digEmAll

+0

서로 독립적 인 모든 행에 대해 별도의 JSON 객체를 생성 할 수 있습니까? 예 : – user2878729

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 
     } 
    ] 
    } 
] 
관련 문제