问题
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