从R

时间:2016-03-30 14:21:59

标签: r list dataframe lapply

我想从n列表中创建一个数据帧。每个列表包含3个不同的列表。我只对这3个列表中的1个列表感兴趣。我感兴趣的列表是一个包含12个122个变量的数据框。

我的lapply函数中的输入tmp是每5个观察值的n列表。 其中2个是纬度和经度。这就是我的lapply函数的样子:

DF_Google_Places<- lapply(tmp, function(tmp){

Latitude<-tmp$Latitude

Longitude<-tmp$Longitude

LatLon<- paste(Latitude,Longitude, sep=",")

res<-GET(paste("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",LatLon,"&radius=200&types=food&key=AIzaSyDS6usHdhdoGIj0ILtXJKCjuj7FBmDEzpM", sep=""))

  jsonAnsw<-content(res,"text")

  myDataframe<- jsonlite::fromJSON(content(res,"text"))

})

我的问题是:如何将这12个12个变量的列表从n列表中的数据帧中获取?

有人可以帮帮我吗?谢谢

1 个答案:

答案 0 :(得分:0)

我只是将我的评论作为答案发布,因此我可以显示输出以向您显示这个想法:

x <- list(a=list(b=1,c=2),d=list(b=3,c=4))

所以x是一个嵌套的列表结构,在这种情况下,一致的命名/结构向下一级。

> x
$a
$a$b
[1] 1

$a$c
[1] 2


$d
$d$b
[1] 3

$d$c
[1] 4

现在我们将使用do.call构建data.frame。我们需要传递一个命名的参数列表,因此我们将使用list(sapply来获取命名列表。我们将按位置遍历列表的较高级别,并按名称遍历内部级别,因为名称在内部级别的子列表中是一致的。请注意,关键思想主要是扭转直观的索引方式;因为我想从第一级的观察结果中提取第二级的观察结果,所以对sapply的内部调用遍历第二级的每个值的第一级的多个值。

y <- do.call(data.frame, 
             list(sapply(names(x[[1]]), 
                         function(t) sapply(1:length(x),
                                            function(j) x[[j]][[t]]))))

> y
  b c
1 1 2
2 3 4

尝试拆分命令以查看每个步骤的作用。如果您的子列表结构中存在任何一致性,您应该能够采用这种方法以正确的顺序遍历该结构并折叠您需要的数据。

在大型数据集上,这不会有效,但对于12x12,它应该没问题。