2017-08-14 177 views
2

考虑一个基本上为矩形的数据的嵌套列表。嵌套列表到数据框并返回到嵌套列表

mylst1 <- list(
    "system" = list(
    "subjectId" = c(101,102,103), 
    "procedureId" = c(202,202,203) 
), 
    "demographics" = list(
    "demo_age" = c(12,22,32), 
    "demo_gender" = c(1,0,1) 
), 
    "items" = list(
    "N" = list(
     "n001" = c(1,2,3), 
     "n002" = c(3,2,1) 
    ), 
    "E" = list(
     "e001" = c(1,2,3), 
     "e002" = c(3,2,1) 
    ) 
) 
) 

因为嵌套列表是尴尬的工作,让我们创建一个数据帧: myDf <- data.frame(mylst1)

到目前为止好,现在我可以myDf执行我的所有操作。我们假设我只是过滤了一些观察结果。问题是,我需要返回相同的嵌套表结构所要求的网络应用程序,我想送这个数据,但现在当然的数据是这样的:

> str(myDf)  
'data.frame': 3 obs. of 8 variables: 
    $ system.subjectId  : num 101 102 103 
    $ system.procedureId  : num 202 202 203 
    $ demographics.demo_age : num 12 22 32 
    $ demographics.demo_gender: num 1 0 1 
    $ items.N.n001   : num 1 2 3 
    $ items.N.n002   : num 3 2 1 
    $ items.E.e001   : num 1 2 3 
    $ items.E.e002   : num 3 2 1 

什么是最好的解决办法以原始列表格式获取这些数据?我正在考虑使用.作为每个级别的分隔符,但我不确定如何在实践中做到这一点。

感谢

回答

3

一种选择是relist(假设列都是相同的class的),如“是myDF”

newlst <- relist(unlist(myDf), skeleton = mylst1) 
identical(mylst1, newlst) 
#[1] TRUE 
+2

一个主要的警告(我相信)是数量myDF中的元素不能更改(不添加或删除行)。第二个潜在问题是'unlist'会将所有元素强制为相同类型。 – lmo

+0

@lmo是的,这是对的,我加了关于同一类的假设 – akrun

+0

谢谢!我不知道'relist()'!正如lmo指出的那样,问题是我现在无法添加或删除案例。这里有工作吗? –