将数据框观察结果转换为列表列表

时间:2017-10-02 21:49:00

标签: json r dataframe

我在R中有一个包含三列的数据框。

  1. LHS
  2. RHS
  3. 定罪
  4. 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))
    

    以下是输出结果。

    output

    我想要做的是把它变成一个数据框,每个项目在lhs中有一列,列表作为第二列,格式为[[rhs,conviction],[rhs,conviction]]

    这样的事情:

    enter image description here

    所有这一切的最终目标是拥有一个嵌套的JSON文件。

    最终的JSON应该类似于:

    enter image description here

    感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用tidyversenest部分数据框。这仍将为您提供嵌套的tibble列。要将此列转换为列表,您可以使用maplapply,如此

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)