Удалите дубликаты при преобразовании R в JSON [duplicate]

вы можете использовать встроенную функцию list ():

newlist=list(oldlist)

Я думаю, этот код вам поможет.

1
задан user2878729 21 July 2014 в 10:28
поделиться

3 ответа

Желаемый объект 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 ] 
} 
]
0
ответ дан agstudy 21 August 2018 в 15:57
поделиться
  • 1
    Вопрос был отредактирован. Пожалуйста, помогите мне в том, как создать новую структуру JSON, о которой я просил. Благодарю. – user2878729 21 July 2014 в 06:25

Прежде всего, ваш 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"]
    }
]

EDIT (согласно вашему редактированию):

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

EDIT 2:

Вместо того, чтобы писать код для вас, я бы попытался объяснить, как структура R превращается в json пакетом RJSONIO.

Что касается json conversion я рассматриваю 3 «вид» объектов:

  1. неназванный список (или вектор)
  2. названный список (или вектор)
  3. вектор один элемент

1) Неименованный список (или вектор) элементов (например, v <- list('a','b','c')) переводится в json как:

[ element_1, element_2, element_3, ... ]

с element_n является n-м элементом списка. Конечно, каждый элемент списка может быть, в свою очередь, другим сложным объектом, который превращается в json, следуя 3 правилам, которые я описываю здесь.

2) Именованный список (или вектор) (например, n <- list(A="foo",B="bar")), переводится в json как:

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

с name_n, являющимся именем n-го элемента именованного списка, и value_1 значением n-го элемента именованный список. Конечно, каждое значение именованного списка может быть, в свою очередь, еще одним сложным объектом, который превращается в json, следуя 3 правилам, которые я описываю здесь.

3) Как вы могли бы правильно указать, каждый объект в R - вектор. Даже a <- 1 является числовым вектором одного элемента. Итак, следуя двум предыдущим правилам, вы ожидаете, например, что 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 }'
1
ответ дан digEmAll 21 August 2018 в 15:57
поделиться
  • 1
    Вопрос был отредактирован. Пожалуйста, помогите мне в том, как создать новую структуру JSON, о которой я просил. – user2878729 21 July 2014 в 06:25
  • 2
    @ user2878729: проверьте мое редактирование. BTW пытается понять, как генерируется json, начиная с структуры R. Это очень легко;) – digEmAll 21 July 2014 в 08:18
  • 3
    Можем ли мы генерировать отдельные объекты JSON для каждой строки, независимой друг от друга? как например: – user2878729 21 July 2014 в 10:09
  • 4
    Я еще раз редактировал свой вопрос. Я очень сожалею об этом. Пожалуйста, пройдите через него и помогите мне. – user2878729 21 July 2014 в 10:29
  • 5
    @ user2878729: Stackoverflow - это не место, где вы можете попросить пользователей написать код для вас, а скорее место, где вы сможете научиться решать свои проблемы. Следуя этой идее, я опубликовал описание того, как работает RJSONIO. Я уверен, что вы сможете выполнить свою задачу после прочтения моего объяснения;) – digEmAll 22 July 2014 в 09:03

Вам нужно создать соответствующий вложенный список

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 
      } 
    ] 
  } 
]
0
ответ дан mnel 21 August 2018 в 15:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: