Convert Triple Level List Structure into data.fram

2019-09-02 14:53发布

问题:

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