有问题的数据是我转换为列表的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和权重列不是列表。
谢谢你。
答案 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"))
以拉出所需的列。