2014-11-05 62 views
0

我想知道如何将由FQL查询生成的列表转换为结构化数据框。R:如何将输出列表从FQL查询转换为data.frame?

我用Rfacebook问FQL查询,如:

getFQL("SELECT name, friends_count, sex, languages FROM user WHERE uid IN 
     (SELECT uid2 FROM friend WHERE uid1=me()), token) 

这为我提供了一个列表作为输出,它看起来像:

[[1]] 
[[1]]$name 
[1] "Peter Fuller" 

[[1]]$friend_count 
[1] 186 

[[1]]$sex 
[1] "male" 

[[1]]$languages 
list() 


[[2]] 
[[2]]$name 
[1] "Max Tester" 

[[2]]$friend_count 
[1] NULL 

[[2]]$languages 
[[2]]$languages[[1]] 
[[2]]$languages[[1]]$id 
[1] 1.056736e+14 

[[2]]$languages[[1]]$name 
[1] "English" 


[[2]]$languages[[2]] 
[[2]]$languages[[2]]$id 
[1] 1.060595e+14 

[[2]]$languages[[2]]$name 
[1] "Italian" 


[[2]]$languages[[3]] 
[[2]]$languages[[3]]$id 
[1] 1.144157e+14 

[[2]]$languages[[3]]$name 
[1] "Persian" 

我的目标是到列表转换成数据帧,使上面的列表看起来像:

  name friend_count     languages 
1 Peter Fuller   186       NA 
2 Max Tester   NA Englisch, Italian, Persian 

不幸的是,我的努力unlist()matrix失败。

回答

1

首先将每条记录分别给出LL,然后使用tapplytoString连接成具有相同名称的常用字符串组件。然后使用rbind.fill从plyr创建最终的数据帧:

library(plyr) # rbind.fill 

LL <- lapply(L, unlist) 
fun <- function(x) as.data.frame(as.list(tapply(x, names(x), toString))) 
do.call(rbind.fill, lapply(LL, fun)) 

捐赠:

friend_count   name sex        languages.id 
1   186 Peter Fuller male          <NA> 
2   <NA> Max Tester <NA> 1.056736e+14, 1.060595e+14, 1.144157e+14 
      languages.name 
1      <NA> 
2 English, Italian, Persian 

请注意,我们假设该输入:

L <- list(list(name = "Peter Fuller", friend_count = 186, sex = "male", 
    languages = list()), 
    list(name = "Max Tester", friend_count = NULL, 
     languages = list(list(id = 1.056736e+14, name = "English"), 
     list(id = 1.060595e+14, name = "Italian"), 
     list(id = 1.144157e+14, name = "Persian")))) 
相关问题