R在数据帧中提取列表

时间:2015-10-30 15:20:41

标签: json r list

解析数据框中变量中嵌入的列表的最佳方法是什么?

在R中解析json时(我通常使用jsonlite包),我经常最终得到包含列表(其他列表或数据帧)的数据框列。一个简单的例子就是解析Twitter流数据,其中返回坐标,如纬度和经度列表。一个更复杂的例子(以及我目前正在努力解决的一个例子)是医生的JSON,它将地址解析为数据帧列表。以下是一些说明结构的示例数据(顺便说一下,这是公共数据):

> str(df)
Classes ‘tbl_df’ and 'data.frame':  2 obs. of  2 variables:
 $ addresses:List of 2
  ..$ :'data.frame':    1 obs. of  6 variables:
  .. ..$ address  : chr "Department of Palliative Care"
  .. ..$ address_2: chr "2525 Cumberland Parkway, SE"
  .. ..$ city     : chr "Atlanta"
  .. ..$ state    : chr "GA"
  .. ..$ zip      : chr "30305"
  .. ..$ phone    : chr "4043650966"
  ..$ :'data.frame':    2 obs. of  6 variables:
  .. ..$ address  : chr  "5445 Meridian Mark Road" "3619 South Fulton Avenue"
  .. ..$ address_2: chr  "Suite 370" ""
  .. ..$ city     : chr  "Atlanta" "Hapeville"
  .. ..$ state    : chr  "GA" "GA"
  .. ..$ zip      : chr  "30342" "30354"
  .. ..$ phone    : chr  "4047652020" "4047652020"
 $ npi      : chr  "1497831390" "1578667986"

jsonlite有一个函数(flatten)用于将嵌入数据帧提取到单个变量,但它不适用于列表。

在Twitter示例中,我可以使用for循环将列表项提取到同一数据框中的变量:

for (i in 1:nrow(df)){
  #sometimes coordinates is blank, so check
  if (length(df2$coordinates.coordinates[[i]]>0)){
    df2[i,"coordinates.lon"]<- df2$coordinates.coordinates[[i]][1]
    df2[i,"coordinates.lat"]<- df2$coordinates.coordinates[[i]][2]
  }

在Doctor示例中,由于每个Doctor可以有多个地址,因此我需要创建一个新数据集。

library(dplyr)
addresses = data.frame()
for (i in 1:nrow(df)){
  x<-df$addresses[[i]]
  #need an identifier
  x$id <-df[[i,"npi"]]
  addresses <-bind_rows(addresses, x)
}

虽然这两个例子都有效,但它们都是a)慢而b)不是&#34; R&#34;做事的方式(据我所知)。

所以,我的问题是:什么是更好,更快,更多&#34; R&#34;从数据框变量中提取列表的方法?

1 个答案:

答案 0 :(得分:1)

感谢Richard Scriven。 unnest tidr中的Attendee正好给了我所需要的东西。