首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R: jsonlite导出键:列表中的值对

R: jsonlite导出键:列表中的值对
EN

Stack Overflow用户
提问于 2016-03-25 21:03:47
回答 3查看 980关注 0票数 1

我有一个可变长度的列表。每个嵌套列表的第一个值是键,列表中的其余值将是数组条目。看起来是这样的:

代码语言:javascript
运行
复制
[[1]]
[1] "Bob"      "Apple"

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

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

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

我提取的密钥和条目如下:

代码语言:javascript
运行
复制
keys <- lapply(x, '[', 1)
entries <- lapply(x, '[', -1)

但是现在我有了这些,我不知道如何关联一个键:R中的值对,而不首先创建一个矩阵,但这是愚蠢的,因为我的数据无论如何都不适合于矩形(我看到的每个例子都使用来自矩阵的列名作为键值)。

这是我使用矩阵、分配行名、然后使用jsonLite导出到JSON的糟糕方法。

代码语言:javascript
运行
复制
#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)

结果是好的,但是实现很糟糕。结果:

代码语言:javascript
运行
复制
[{"Bob":["Apple"],"Cindy":["Apple","Banana","Orange","Pear","Raspberry"],"Mary":["Orange","Strawberry"],"George":["Banana"]}]

请让我知道可能有更好的方法来实现这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-25 23:43:15

不如:

代码语言:javascript
运行
复制
names(entries) <- unlist(keys) 
toJSON(entries)
票数 1
EN

Stack Overflow用户

发布于 2016-03-25 23:03:21

考虑以下lapply()方法:

代码语言:javascript
运行
复制
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"]
#  }
#] 
票数 1
EN

Stack Overflow用户

发布于 2016-03-30 20:18:56

我认为这个问题已经得到了充分的回答,但是这里有一个使用purrrjsonlite的方法。

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36227993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档