2016-03-25 2 views
1

У меня есть список списков переменной длины. Первое значение каждого вложенного списка - это ключ, а остальные значения в списке - это запись массива. Это выглядит примерно так:R: jsonlite - ключ экспорта: пары значений из списка списков

[[1]] 
[1] "Bob"  "Apple" 

[[2]] 
[1] "Cindy" "Apple"  "Banana"  "Orange" "Pear" "Raspberry"   

[[3]] 
[1] "Mary"  "Orange" "Strawberry" 

[[4]] 
[1] "George" "Banana" 

Я извлеченный ключи и записи следующим образом:

keys <- lapply(x, '[', 1) 
entries <- lapply(x, '[', -1) 

, но теперь у меня есть это, я не знаю, как я могу связать ключ: пара значений в R, не создавая сначала матрицу, но это глупо, так как мои данные не помещаются в прямоугольник в любом случае (каждый пример, который я видел, использует имена столбцов из матрицы в качестве значений ключа).

Это мой дрянной метод, используя матрицу, назначая имена ростов, а затем используя jsonLite для экспорта в JSON.

#Create a matrix from entries, without recycling 
#I found this function on StackOverflow which seems to work... 
cbind.fill <- function(...){ 
    nm <- list(...) 
    nm <- lapply(nm, as.matrix) 
    n <- max(sapply(nm, nrow)) 
    do.call(cbind, lapply(nm, function (x) 
    rbind(x, matrix(, n-nrow(x), ncol(x))))) 
} 
#Call said function 
matrix <- cbind.fill(entries) 
#Transpose the thing 
matrix <- t(matrix) 
#Set column names 
colnames(matrix) <- keys 
#Export to json 
json<-toJSON(matrix) 

Результат хороший, но реализация сосет. Результат:

[{"Bob":["Apple"],"Cindy":["Apple","Banana","Orange","Pear","Raspberry"],"Mary":["Orange","Strawberry"],"George":["Banana"]}] 

Просьба сообщить мне о лучших способах, которые могут существовать для достижения этого.

+0

Как насчет: 'имена (записи) <- unlist (keys); toJSON (записи) '. (или использовать 'sapply' при получении ключей, чтобы избежать необходимости' unlist() '). – Jthorpe

+0

Это именно то, что я искал, но не смог найти поисковую систему. Спасибо за предложения. Вы хотите создать ответ, чтобы я принял его? – Tsaari

ответ

1

Как насчет:

names(entries) <- unlist(keys) 
toJSON(entries) 
1

Рассмотрим следующий lapply() подход:

library(jsonlite) 
entries <- list(c('Bob', 'Apple'), 
       c('Cindy', 'Apple', 'Banana', 'Orange','Pear','Raspberry'), 
       c('Mary', 'Orange', 'Strawberry'), 
       c('George', 'Banana')) 

# ITERATE ALL CONTENTS EXCEPT FIRST 
inner <- list() 
nestlist <- lapply(entries, 
          function(i) { 
          inner <- i[2:length(i)] 
          return(inner) 
        }) 

# NAME EACH ELEMENT WITH FIRST ELEMENT 
names(nestlist) <- lapply(entries, function(i) i[1]) 
#$Bob 
#[1] "Apple"  
#$Cindy 
#[1] "Apple"  "Banana" "Orange" "Pear"  "Raspberry"  
#$Mary 
#[1] "Orange"  "Strawberry"  
#$George 
#[1] "Banana" 

x <- toJSON(list(nestlist), pretty=TRUE) 
x 
#[ 
# { 
# "Bob": ["Apple"], 
# "Cindy": ["Apple", "Banana", "Orange", "Pear", "Raspberry"], 
# "Mary": ["Orange", "Strawberry"], 
# "George": ["Banana"] 
# } 
#] 
0

Я думаю, что это уже достаточно ответил, но здесь является метод с использованием purrr и jsonlite.

library(purrr) 
library(jsonlite) 


sample_data <- list(
    list("Bob","Apple"), 
    list("Cindy","Apple","Banana","Orange","Pear","Raspberry"), 
    list("Mary","Orange","Strawberry"), 
    list("George","Banana") 
) 

sample_data %>% 
    map(~set_names(list(.x[-1]),.x[1])) %>% 
    toJSON(auto_unbox=TRUE, pretty=TRUE) 
Смежные вопросы