【问题标题】:How to convert a dataframe into a nested list?如何将数据框转换为嵌套列表?
【发布时间】:2013-02-18 20:05:45
【问题描述】:

我有一个数据框,我想将其转换为具有自定义嵌套级别的嵌套列表。我就是这样做的,但我确信有更好的方法:

data <- data.frame(city=c("A", "A", "B", "B"), street=c("a", "b", "a", "b"), tenant=c("Smith","Jones","Smith","Jones"), income=c(100,200,300,400))

nested_data <- lapply(levels(data$city), function(city){
    data_city <- subset(data[data$city == city, ], select=-city)
    list(city = city, street_values=lapply(levels(data_city$street), function(street){
        data_city_street <- subset(data_city[data_city$street == street, ], select=-street)
        tenant_values <- apply(data_city_street, 1, function(income_tenant){
            income_tenant <- as.list(income_tenant)
            list(tenant=income_tenant$tenant, income=income_tenant$income)
        })
        names(tenant_values) <- NULL
        list(street=street, tenant_values=tenant_values)
    }))
})

JSON 中的输出如下所示:

library(rjson)
write(toJSON(nested_data), "")
[{"city":"A","street_values":[{"street":"a","tenant_values":[{"tenant":"Smith","income":"100"}]},{"street":"b","tenant_values":[{"tenant":"Jones","income":"200"}]}]},{"city":"B","street_values":[{"street":"a","tenant_values":[{"tenant":"Smith","income":"300"}]},{"street":"b","tenant_values":[{"tenant":"Jones","income":"400"}]}]}]

# or prettified:

[
  {
    "city": "A",
    "street_values": [
      {
        "street": "a",
        "tenant_values": [
          {
            "tenant": "Smith",
            "income": "100"
          }
        ]
      },
      {
        "street": "b",
        "tenant_values": [
          {
            "tenant": "Jones",
            "income": "200"
          }
        ]
      }
    ]
  },
  {
    "city": "B",
    "street_values": [
      {
        "street": "a",
        "tenant_values": [
          {
            "tenant": "Smith",
            "income": "300"
          }
        ]
      },
      {
        "street": "b",
        "tenant_values": [
          {
            "tenant": "Jones",
            "income": "400"
          }
        ]
      }
    ]
  }
]

有没有更好的方法来做到这一点?

【问题讨论】:

  • 那么,您是在问一个关于 R 的 JSON 输出的问题,或者如何创建一个 R 对象,它是 R 定义中的“嵌套列表”,例如foo&lt;-list(bar=NA,snafu="hello, Dave"); foo[[bar]] &lt;- list(a=1,b=2) ?
  • 我只是展示了JSON 输出,因为它比 R 列表格式更容易理解,但我想从 R 数据框转到 R 列表

标签: json r list dataframe


【解决方案1】:

我通过将函数更改为:

nestedList <- rapply(lapply(split(df[-1], df[1]),
                          function(x) split(x[-1], x[1])),
                   f = function(x) as.data.frame(as.list(split(x,x))),  how = "replace")

【讨论】:

    【解决方案2】:

    使用split 帮助您完成大部分工作,最后一步使用rapply 怎么样:

    nestedList <- rapply(lapply(split(data[-1], data[1]), 
                                function(x) split(x[-1], x[1])), 
                         f = function(x) as.character(unlist(x)), 
                         how = "replace")
    

    这是输出:

    nestedList
    # $A
    # $A$a
    # $A$a$tenant
    # [1] "Smith"
    # 
    # $A$a$income
    # [1] "100"
    # 
    # 
    # $A$b
    # $A$b$tenant
    # [1] "Jones"
    # 
    # $A$b$income
    # [1] "200"
    # 
    # 
    # 
    # $B
    # $B$a
    # $B$a$tenant
    # [1] "Smith"
    # 
    # $B$a$income
    # [1] "300"
    # 
    # 
    # $B$b
    # $B$b$tenant
    # [1] "Jones"
    # 
    # $B$b$income
    # [1] "400"
    

    还有结构:

    > str(nestedList)
    List of 2
     $ A:List of 2
      ..$ a:List of 2
      .. ..$ tenant: chr "Smith"
      .. ..$ income: chr "100"
      ..$ b:List of 2
      .. ..$ tenant: chr "Jones"
      .. ..$ income: chr "200"
     $ B:List of 2
      ..$ a:List of 2
      .. ..$ tenant: chr "Smith"
      .. ..$ income: chr "300"
      ..$ b:List of 2
      .. ..$ tenant: chr "Jones"
      .. ..$ income: chr "400"
    

    结构与您正在寻找的不完全匹配,但这可能有助于您开始使用替代方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多