我在R中有一个包含三列的数据框。
example <- data.frame(lhs=c('phones', 'phones', 'phones', 'shoes', 'shoes', 'shoes'), rhs=c('chargers', 'headphones', 'shoes', 'shirts', 'pants', 'socks'), conviction=c(1.376, 1.259, 1.087, 1.295, 1.083, 0.978))
以下是输出结果。
我想要做的是把它变成一个数据框,每个项目在lhs中有一列,列表作为第二列,格式为[[rhs,conviction],[rhs,conviction]]
这样的事情:
所有这一切的最终目标是拥有一个嵌套的JSON文件。
最终的JSON应该类似于:
感谢您的帮助。
答案 0 :(得分:0)
您可以使用tidyverse
到nest
部分数据框。这仍将为您提供嵌套的tibble列。要将此列转换为列表,您可以使用map
和lapply
,如此
library(tidyverse)
ans <- example %>%
nest(-lhs) %>%
mutate(data = map(data, ~lapply(1:nrow(.x), function(i) .x[i,]))) %>%
rename(rhs = data)
这里是rhs
列的样子
ans$rhs
# [[1]]
# [[1]][[1]]
# # A tibble: 1 x 2
# rhs conviction
# <fctr> <dbl>
# 1 chargers 1.376
# [[1]][[2]]
# # A tibble: 1 x 2
# rhs conviction
# <fctr> <dbl>
# 1 headphones 1.259
# [[1]][[3]]
# # A tibble: 1 x 2
# rhs conviction
# <fctr> <dbl>
# 1 shoes 1.087
# [[2]]
# [[2]][[1]]
# # A tibble: 1 x 2
# rhs conviction
# <fctr> <dbl>
# 1 shirts 1.295
# [[2]][[2]]
# # A tibble: 1 x 2
# rhs conviction
# <fctr> <dbl>
# 1 pants 1.083
# [[2]][[3]]
# # A tibble: 1 x 2
# rhs conviction
# <fctr> <dbl>
# 1 socks 0.978
编辑以返回特定输出格式
我意识到你仍然会得到一个带有上述答案的元组列表,要转换为矢量列表,请使用以下内容(unlist
已添加)
mutate(data = map(data, ~lapply(1:nrow(.x), function(i) unlist(.x[i,]))))
答案 1 :(得分:0)
要获得必需的JSON结构,您确实需要一个列表,因为data.frame无法为您提供所需的嵌套结构。使用一点dplyr,您可以summarise
将每组分组数据rhs
分配到data.frame中,使用conviction
作为rhs
的每个值的名称。将结果列表的名称设置为library(dplyr)
example <- data.frame(lhs=c('phones', 'phones', 'phones', 'shoes', 'shoes', 'shoes'),
rhs=c('chargers', 'headphones', 'shoes', 'shirts', 'pants', 'socks'),
conviction=c(1.376, 1.259, 1.087, 1.295, 1.083, 0.978))
example %>%
group_by(lhs) %>%
summarise(rest = list(as.data.frame(t(setNames(conviction, rhs))))) %>%
{ setNames(.$rest, .$lhs) } %>%
jsonlite::toJSON(pretty = TRUE)
#> {
#> "phones": [
#> {
#> "chargers": 1.376,
#> "headphones": 1.259,
#> "shoes": 1.087
#> }
#> ],
#> "shoes": [
#> {
#> "shirts": 1.295,
#> "pants": 1.083,
#> "socks": 0.978
#> }
#> ]
#> }
的值并转换为JSON,即可获得
data Digit = Zero | One | Two | Three | Four | Five | Six | Seven | Eight |
Nine
deriving (Eq, Show)
data Number = Single Digit | Many Digit Number deriving (Eq, Show)
data Expr = Lit Number
| Sub Expr
| Sum Expr Expr
| Mul Expr Expr
deriving (Eq, Show)