2014-07-22 3 views
1

이전 질문을 2 번 편집 한 후에 같은 질문을했습니다. 이 웹 사이트의 나쁜 사용에 유감입니다. 나는 삭제를 위해 플래그를 지정했고 여기에 동일한 새로운 질문을 올리고 있습니다. 이것을 들여다보십시오.R의 데이터 프레임을 JSON 객체 시퀀스로 변환

나는 기본적으로 추천 시스템 코드를 작업 중이다. 출력은 JSON 객체의 시퀀스로 변환되어야합니다. 필자는 모든 항목 ID에 대해 룩업 테이블이있는 행렬을 가지고 관련 항목 중 가장 가까운 항목 목록과 해당 조합과 관련된 유사성 점수를 표시합니다.

예제를 통해 설명하겠습니다.

행렬이 있다고 가정합니다. 아래 예제에서 항목 1은 항목 22와 23과 유사하지만 유사성 점수는 각각 0.8과 0.5입니다. 나머지 행은 동일한 구조를 따릅니다.

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 엔티티 각 조합 유사도 점수에 따라 각 항목의 JSON 구조 (각 행마다 X1)를 원하고,이 순서대로 수행된다. 이 개별 객체를 포함하는 전체 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 객체로 나는 그것을 원하지 않는다. 나는 이것들과 같은 개개의 것들을 파일에 쓰길 원한다.

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

답변

1
library(rjson) 
## Your matrix 
mat <- matrix(c(1,34,23, 
       22, 4, 7, 
       23,87,92, 
       0.8, 0.4, 0.6, 
       0.5, 0.4, 0.5), byrow=FALSE, nrow=3) 

나는 행렬의 행을 취하고 JSON 객체를 반환하는 함수 (매우 재미 있지 이름 makejson)를 사용합니다. 두 개의 list 목적, _iditems하게하고, I는 행렬의 각각의 행에 대한 함수를 사용해서 apply를 사용 JSON 객체

makejson <- function(x, coid="ABC") { 
    `_id` <- list(coid = coid, iid=x[1]) 
    nitem <- (length(x) - 1)/2 # Number of items 
    items <- list() 
    for(i in seq(1, nitem)) { 
     items[[i]] <- list(item = x[i + 1], score = x[i + 1 + nitem]) 
    } 
    toJSON(list(`_id`=`_id`, items=items)) 
} 

(또는 for 루프)로 결합한다.

res <- apply(mat, 1, makejson, coid="XYZ") 
cat(res, sep = "\n") 
## {"_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}]} 

결과

file 인수를 지정하여 cat있는 파일에 저장할 수 있습니다. 당신이 그런 식으로 그것을 가지고 할 경우 출력과 나의 작은 차이가 있습니다

## cat(res, sep="\n", file="out.json") 

, 숫자는 따옴표 (")에 있습니다., mat 문자이어야합니다.

## mat <- matrix(as.character(c(1,34,23, ... 

희망을 도움이,

alex

+0

예.도움이되었지만 각 줄마다 하나씩 JSON 객체를 가져올 수 없습니다. 각 JSON 객체의 요소는 서로 다른 줄에 있습니다. 그것은 3 행 행렬에 대해 제대로 작동하지만 큰 행렬 내 코드에 있습니다. 각각의 JSON 객체를 동일한 행에 배치하는 방법에 대한 제안? 각 요소의 수와 관계없이? 미리 감사드립니다. – user2878729

+0

아마도 실제 데이터의 구조 중 일부는 예제에 없습니다. 내 대답은 각 데이터 행에 대해 하나의 json 객체가 생성된다는 것입니다 ('apply'사용). 나는 실제 데이터의 구조가 예제 데이터와 같지 않다고 생각한다. 내 충고 : 귀하의 실제 데이터 행을 가지고,이 행에 대한 JSON 개체가 어떻게 생겼는지 생각하고 그것을 수용하기 위해 내 대답의 기능을 변경하십시오. – alko989

관련 문제