建立具有奇怪结构的列表(?)

问题描述 投票:0回答:1

我在R中构建列表以匹配已解码JSON对象的结构时遇到问题。

考虑以下列表tbl,使用jsonlite::fromJSON()构造如下

tbl <- jsonlite::fromJSON('{"toplevel": [{"midlevel": {"id":"1",
"country":"US"
}},{"midlevel": {"id":"2",
"country":"US"
}},{"midlevel": {"id":"3",
"country":"GB"
}},{"midlevel": {"id":"5",
"country":"FR"
}}]}')

tbl
#> $toplevel
#>   midlevel.id midlevel.country
#> 1           1               US
#> 2           2               US
#> 3           3               GB
#> 4           5               FR

str(tbl)
#> List of 1
#>  $ toplevel:'data.frame':    4 obs. of  1 variable:
#>   ..$ midlevel:'data.frame': 4 obs. of  2 variables:
#>   .. ..$ id     : chr [1:4] "1" "2" "3" "5"
#>   .. ..$ country: chr [1:4] "US" "US" "GB" "FR"

您可以看到tbl$toplevel是具有4行1列的数据帧,但是tbl$toplevel$midlevel也具有4行。

我需要能够构建具有相同结构的列表,以便在使用jsonlite::toJSON()时其编码相同,但是我遇到了一些问题。

tbl_attempt <-
  list(
    toplevel = data.frame(
      midlevel = data.frame(
        id = c(1, 2, 3, 5),
        country = c("US", "US", "GB", "FR"), stringsAsFactors = FALSE
      ), stringsAsFactors = FALSE
    )
  )

tbl_attempt
#> $toplevel
#>   midlevel.id midlevel.country
#> 1           1               US
#> 2           2               US
#> 3           3               GB
#> 4           5               FR

str(tbl_attempt)
#> List of 1
#>  $ toplevel:'data.frame':    4 obs. of  2 variables:
#>   ..$ midlevel.id     : num [1:4] 1 2 3 5
#>   ..$ midlevel.country: chr [1:4] "US" "US" "GB" "FR"

根据以上说明,tbl_attempt在控制台上打印的内容与tbl完全相同,但结构不同。有什么想法可以复制tbl的结构吗?

我已经考虑过使用dput(),但这感觉有点不客气,所以宁愿避免。

r json jsonlite
1个回答
0
投票

您可以分两步完成:

tbl2 <- list(
  toplevel = data.frame(
    midlevel = seq_len(4)
  )
)
tbl2$toplevel$midlevel <- data.frame(
  id = c("1", "2", "3", "5"),
  country = c("US", "US", "GB", "FR"),
  stringsAsFactors = FALSE
)
© www.soinside.com 2019 - 2024. All rights reserved.