2014-11-05 102 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")))) 
相關問題