Convert Triple Level List Structure into data.frame

时光毁灭记忆、已成空白 提交于 2019-12-25 04:54:15

问题


I have a triple level list, the dput is below. How can I convert this into a data.frame? Output should be a 6x23 data.frame and preferably with the correct column names. The number of rows is the length() of the top level list and the number of columns is combined length() of the lower-most level lists.

I tried doing this as suggested here (R list to data frame):

df <- data.frame(matrix(unlist(l), nrow=6, byrow=T))

and it almost works, but everything is converted to a factor. This is because unlist() only returns a vector and everything is forced into the same data type.

Thank you.

list(structure(list(contract = structure(list(conId = "98333158", 
    symbol = "6823", sectype = "STK", exch = "SEHK", primary = "SEHK", 
    expiry = "", strike = "0", currency = "HKD", right = "0", 
    local = "6823", multiplier = "", combo_legs_desc = "", comboleg = "", 
    include_expired = "", secIdType = "", secId = ""), .Names = c("conId", 
"symbol", "sectype", "exch", "primary", "expiry", "strike", "currency", 
"right", "local", "multiplier", "combo_legs_desc", "comboleg", 
"include_expired", "secIdType", "secId"), class = "twsContract"), 
    portfolioValue = structure(list(position = 9000, marketPrice = 7.4949999, 
        marketValue = 67455, averageCost = 7.34352835, unrealizedPNL = 1363.24, 
        realizedPNL = 0, accountName = "U"), .Names = c("position", 
    "marketPrice", "marketValue", "averageCost", "unrealizedPNL", 
    "realizedPNL", "accountName"))), .Names = c("contract", "portfolioValue"
), class = "eventPortfolioValue"), structure(list(contract = structure(list(
    conId = "107651219", symbol = "EEM", sectype = "OPT", exch = "AMEX", 
    primary = "AMEX", expiry = "20130621", strike = "45", currency = "USD", 
    right = "C", local = "EEM   130622C00045000", multiplier = "100", 
    combo_legs_desc = "", comboleg = "", include_expired = "", 
    secIdType = "", secId = ""), .Names = c("conId", "symbol", 
"sectype", "exch", "primary", "expiry", "strike", "currency", 
"right", "local", "multiplier", "combo_legs_desc", "comboleg", 
"include_expired", "secIdType", "secId"), class = "twsContract"), 
    portfolioValue = structure(list(position = 7, marketPrice = 0.335, 
        marketValue = 234.5, averageCost = 191.78912855, unrealizedPNL = -1108.02, 
        realizedPNL = 0, accountName = "U"), .Names = c("position", 
    "marketPrice", "marketValue", "averageCost", "unrealizedPNL", 
    "realizedPNL", "accountName"))), .Names = c("contract", "portfolioValue"
), class = "eventPortfolioValue"), structure(list(contract = structure(list(
    conId = "114533598", symbol = "ESTX50", sectype = "FUT", 
    exch = "DTB", primary = "DTB", expiry = "20130621", strike = "0", 
    currency = "EUR", right = "0", local = "FESX JUN 13", multiplier = "10", 
    combo_legs_desc = "", comboleg = "", include_expired = "", 
    secIdType = "", secId = ""), .Names = c("conId", "symbol", 
"sectype", "exch", "primary", "expiry", "strike", "currency", 
"right", "local", "multiplier", "combo_legs_desc", "comboleg", 
"include_expired", "secIdType", "secId"), class = "twsContract"), 
    portfolioValue = structure(list(position = 0, marketPrice = 2639.5, 
        marketValue = 0, averageCost = 0, unrealizedPNL = 0, 
        realizedPNL = -84, accountName = "U"), .Names = c("position", 
    "marketPrice", "marketValue", "averageCost", "unrealizedPNL", 
    "realizedPNL", "accountName"))), .Names = c("contract", "portfolioValue"
), class = "eventPortfolioValue"), structure(list(contract = structure(list(
    conId = "44053851", symbol = "REM", sectype = "STK", exch = "ARCA", 
    primary = "ARCA", expiry = "", strike = "0", currency = "USD", 
    right = "0", local = "REM", multiplier = "", combo_legs_desc = "", 
    comboleg = "", include_expired = "", secIdType = "", secId = ""), .Names = c("conId", 
"symbol", "sectype", "exch", "primary", "expiry", "strike", "currency", 
"right", "local", "multiplier", "combo_legs_desc", "comboleg", 
"include_expired", "secIdType", "secId"), class = "twsContract"), 
    portfolioValue = structure(list(position = 200, marketPrice = 15.5649996, 
        marketValue = 3113, averageCost = 13.9649, unrealizedPNL = 320.02, 
        realizedPNL = 0, accountName = "U"), .Names = c("position", 
    "marketPrice", "marketValue", "averageCost", "unrealizedPNL", 
    "realizedPNL", "accountName"))), .Names = c("contract", "portfolioValue"
), class = "eventPortfolioValue"), structure(list(contract = structure(list(
    conId = "15016062", symbol = "USD", sectype = "CASH", exch = "IDEALPRO", 
    primary = "IDEALPRO", expiry = "", strike = "0", currency = "CAD", 
    right = "0", local = "USD.CAD", multiplier = "", combo_legs_desc = "", 
    comboleg = "", include_expired = "", secIdType = "", secId = ""), .Names = c("conId", 
"symbol", "sectype", "exch", "primary", "expiry", "strike", "currency", 
"right", "local", "multiplier", "combo_legs_desc", "comboleg", 
"include_expired", "secIdType", "secId"), class = "twsContract"), 
    portfolioValue = structure(list(position = 30000, marketPrice = 1.02540505, 
        marketValue = 30762.15, averageCost = 1.02867, unrealizedPNL = -97.95, 
        realizedPNL = 0, accountName = "U"), .Names = c("position", 
    "marketPrice", "marketValue", "averageCost", "unrealizedPNL", 
    "realizedPNL", "accountName"))), .Names = c("contract", "portfolioValue"
), class = "eventPortfolioValue"), structure(list(contract = structure(list(
    conId = "37928772", symbol = "USD", sectype = "CASH", exch = "IDEALPRO", 
    primary = "IDEALPRO", expiry = "", strike = "0", currency = "SGD", 
    right = "0", local = "USD.SGD", multiplier = "", combo_legs_desc = "", 
    comboleg = "", include_expired = "", secIdType = "", secId = ""), .Names = c("conId", 
"symbol", "sectype", "exch", "primary", "expiry", "strike", "currency", 
"right", "local", "multiplier", "combo_legs_desc", "comboleg", 
"include_expired", "secIdType", "secId"), class = "twsContract"), 
    portfolioValue = structure(list(position = 75000, marketPrice = 1.25079, 
        marketValue = 93809.25, averageCost = 1.2473, unrealizedPNL = 261.75, 
        realizedPNL = 0, accountName = "U"), .Names = c("position", 
    "marketPrice", "marketValue", "averageCost", "unrealizedPNL", 
    "realizedPNL", "accountName"))), .Names = c("contract", "portfolioValue"
), class = "eventPortfolioValue"))

回答1:


You need to lapply though each sub-list calling as.data.frame.list explicitly. Then piece together with rbind.

dfr <- do.call(rbind,lapply(l,function(x) as.data.frame.list(lapply(x,as.data.frame.list))))
dim(dfr)
[1]  6 23
table(sapply(dfr,class))

 factor numeric 
     17       6 


来源:https://stackoverflow.com/questions/15527053/convert-triple-level-list-structure-into-data-frame

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!