【问题标题】:Make dataframe from a list of lists in R从R中的列表列表制作数据框
【发布时间】:2016-03-30 14:21:59
【问题描述】:

我想从 n 的列表中创建一个数据框。每个列表包含 3 个不同的列表。我只对里面的 3 个列表中的 1 个列表感兴趣。我感兴趣的列表是一个包含 12 个变量的 12 个 obs 的 data.frame。

我在 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"))

})

我的问题是:如何从 n 列表中将 12 个变量的 12 个 obs 列表放入数据框中?

谁能帮帮我,谢谢

【问题讨论】:

  • 欢迎来到 StackOverflow!请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 也许使用 lapply() 和 Reduce()。类似于:Reduce(function(...) merge(..., all=TRUE), lapply(list_of_lists, function(x) x[[df_number]]) ))
  • 我添加了一些包含我的 lapply 函数的文本
  • 您能否再展示几个您正在使用的对象的示例,也许str(x) 其中x 是您的对象。取决于它的结构,例如使用x &lt;- list(a=list(b=1,c=2),d=list(b=3,c=4)),您可以尝试这样的事情:y &lt;- do.call(data.frame, list(sapply(names(x[[1]]), function(t) sapply(1:length(x),function(j) x[[j]][[t]]))))

标签: r list dataframe lapply


【解决方案1】:

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

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 应该没问题。

【讨论】:

  • 感谢您的评论!
猜你喜欢
  • 2020-03-22
  • 1970-01-01
  • 2012-01-18
  • 2021-11-29
  • 2018-08-01
  • 2018-03-11
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多