需要帮助将4个嵌套列表提取到数据框中

时间:2018-07-26 01:26:03

标签: r

有问题的数据是我转换为列表的JSON结果。数据如下:

data <- list(query_day = c('Monday'),
              requester = c('John'),
              detail =
                list(list(ID = 1, weight = 200),
                     list(ID = 2, weight = 300),
                     list(ID = 3, weight = 400,
                          detail2 = list(height = 6.5,
                                         gender = 'M',
                                         name = 'John')),
                     list(ID = 4, weight = 500),
                     list(ID = 5, weight = 600,
                          detail2 = list(height = 5.5,
                                         gender = 'F',
                                         name = 'Jane'))))

我对提取嵌套在“详细信息”中的数据感兴趣。由于某些清单包含详细信息2,但有些则没有。在尝试提取数据之前,我应用了以下代码

detail <- data[['detail']]
detail_2_cols <- detail[which(sapply(detail, length) == 2)]
detail_3_cols <- detail[which(sapply(detail, length) == 3)]

然后我尝试了两种无效的方法。

第一种方法

result_data.frame <- data.frame(t(sapply(detail_2_cols,c)))

这将导致一个数据帧(根据class())具有ID和权重列。但是这些列仍然是一个列表,使诸如mean()之类的功能不可用。

Dataframe. But columns are lists

第二种方法

result_do.call <-do.call(rbind,lapply(detail_2_cols,data.frame))

这适用于示例:结果是数据帧,每一列都不是列表。

最大的问题是,当我将相同的代码应用于数据集时,我得到了

错误(函数(...,row.names = NULL,check.rows = FALSE,check.names = TRUE ,:参数表示行数不同:1、0

我认为不同的列不应该成为问题,因为我在将它们转换为数据框之前将它们分离了。

在第一种方法中,我希望输出的ID和权重列不是列表。

Expected Output Dataframe

谢谢你。

2 个答案:

答案 0 :(得分:2)

这是检查数据结构的另一种快速而肮脏的方法:

namedtuple

这里是如何使您像数据框架一样行动的(虽然很有效但是很有效):

type != 59

现在,您可以在发布的图像中找到所需的数据框:

library(dplyr)
library(jsonlite)
library(tidyverse)

> z <- data %>% toJSON() %>% fromJSON()
> z$detail
  ID weight detail2.height detail2.gender detail2.name
1  1    200           NULL           NULL         NULL
2  2    300           NULL           NULL         NULL
3  3    400            6.5              M         John
4  4    500           NULL           NULL         NULL
5  5    600            5.5              F         Jane

> z.df <- as.data.frame(z$detail)

> z$detail$detail2
  height gender name
1   NULL   NULL NULL
2   NULL   NULL NULL
3    6.5      M John
4   NULL   NULL NULL
5    5.5      F Jane

答案 1 :(得分:0)

要获取快速而肮脏的修复程序,您可以尝试使用rlist

library(rlist)

rlist::list.flatten(data) %>% dplyr::bind_rows()

您将获得一个小标题,您可以在该小标题上应用dplyr::select(contains("detail"))以拉出所需的列。