2017-05-05 113 views
-4

我从一个API查询中的端点获取一个包含19个元素的370个列表的列表。我试图将其转换为R行中的19行370行。列表到数据框的列表

当我尝试as.dataframe时,我收到一条错误消息:参数意味着行数不同:1,0 当我尝试lapply(datos, ldply),我得到以下错误:结果必须是全部原子,或所有数据帧

也尝试了平面列表帖子。而且还得到消息:参数暗示行的不同数目:1,0

PS:我查了一下关于这个问题以前类似的问题,尝试了答案,但我没有得到我想要的东西

我的数据:

[enter image description here]

预期输出:370行与列19

+0

看看http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/28481250#28481250 – Frank

+0

谢谢。您是否建议我展示我的数据?不知道我该怎么做,我应该使用剪切工具并粘贴? – cyrilmadrid

+0

我试图粘贴在这个评论框中,它不起作用。 – cyrilmadrid

回答

1

考虑滤除NULL实体这是在铸造列表元素到数据帧的挑战。

数据(再现屏幕截图的可见部分)

inner <- 
    list(
    loandId = 2, 
    websiteLoanId = 2, 
    loanName = "Nottingham Student Accodomodation Development Project", 
    amount = 1500000.0, 
    principalRemaining = "0.00", 
    firstDrawDate = "2013-04-16T07:36.08.000z", 
    status = "repaid", 
    sector = NULL, 
    category = "development", 
    holdings = list(1,2,3,4,5), 
    aftermarketForSale = list("a", "b", "c", "d", "e") 
) 

datos= list(loans = lapply(seq(370), function(i) inner)) 

数据帧建立

# FILTER OUT NULLs 
datos$loans <- lapply(datos$loans, function(item) 
    Filter(function(i) length(i) == 1, item) 
) 

# IF ALL ELEMENTS ARE THE SAME (I.E., NULL DROPS SAME ITEM) 
loansdf <- do.call(rbind, lapply(datos$loans, data.frame)) 

# IF NULL DROPS ABOVE ARE NOT SAME, USE BELOW PACKAGES FOR RBINDING METHOS 
loansdf <- plyr::rbind.fill(datos$loans) 
loansdf <- dplyr::bind_rows(datos$loans) 
loansdf <- data.table::rbindlist(datos$loans) 

输出

loansdf 
# loandId websiteLoanId            loanName amount principalRemaining   firstDrawDate status 
# 1   2    2 Nottingham Student Accodomodation Development Project 1500000    0.00 2013-04-16T07:36.08.000z repaid 
# 2   2    2 Nottingham Student Accodomodation Development Project 1500000    0.00 2013-04-16T07:36.08.000z repaid 
# 3   2    2 Nottingham Student Accodomodation Development Project 1500000    0.00 2013-04-16T07:36.08.000z repaid 
# 4   2    2 Nottingham Student Accodomodation Development Project 1500000    0.00 2013-04-16T07:36.08.000z repaid 
# 5   2    2 Nottingham Student Accodomodation Development Project 1500000    0.00 2013-04-16T07:36.08.000z repaid 
# 6   2    2 Nottingham Student Accodomodation Development Project 1500000    0.00 2013-04-16T07:36.08.000z repaid 
# 7   2    2 Nottingham Student Accodomodation Development Project 1500000    0.00 2013-04-16T07:36.08.000z repaid 
# 8   2    2 Nottingham Student Accodomodation Development Project 1500000    0.00 2013-04-16T07:36.08.000z repaid 
+0

非常感谢您的努力,Parfait.I试图复制第一部分你的建议,但我不能完全复制内部的第一个注册,因为一些领域也是一个列表,我不能查看-aftermarketForSale和持股。不,空值不是全部相同,并非所有的字段都是空的,...我发布了一个更完整的数据视图。 – cyrilmadrid

+0

我试图做没有第一阶段的数据帧生成,筛选空值的作品,但plyr,dplyr,data.table给我的错误:loansdf < - plyr :: rbind.fill(datos $ loans) 错误:所有输入到rbind .fill必须是data.frames > loansdf < - dplyr :: bind_rows(datos $ loans) bind_rows_(x,.id)中的错误:不兼容的大小(1!= 2) > loansdf < - data.table :: rbindlist(datos $ loans) data.table :: rbindlist(datos $ loans)中的错误: 项目2有16列,与具有13列的项目1不一致。如果您需要填写缺失的列,请将set参数'fill'设置为TRUE。 – cyrilmadrid

+0

您应该不必运行* Data *示例,因为我试图重新创建您只能在截图中呈现的结构。我其实已经走出了这条路(你应该这样做)。不要将数据/代码负担放在志愿者回答者身上。 – Parfait