【问题标题】:Nested list in dataframe数据框中的嵌套列表
【发布时间】:2018-05-25 15:13:07
【问题描述】:

我在googledrive 包中使用drive_find 来拉取文件列表,输出是一个数据框myDocs,包含3 列:文件名、文件ID 和所有其他文件属性的列表:drive_resource .

我想提取文档的链接。

目前我正在使用 for 循环,如下所示:

myDocs$url <- NA
for (i in 1:nrow(myDocs)) {
  myDocs$url[i] <- myDocs$drive_resource[[i]]$webViewLink
}

这对我来说似乎非常低效,但我找不到一种方法来使用应用功能或类似功能一次性完成所有这些操作。

我知道我可以使用 thisunlist 之类的应用函数来获取整个列表,但我只想访问每一行上的单个元素。

如果它是嵌套数据框而不是列表,我将使用 jsonlite 包中的 flatten,然后只需选择我想要保留的列 - 是否有任何类似的功能,或者巧妙地使用应用功能等. 我可以用它来避免这个循环吗?

【问题讨论】:

  • 您可以输入(myDocs)作为一个工作示例吗?您还可以在 purrr blog.rstudio.com/2015/09/29/purrr-0-1-0 中查看地图功能
  • 看看tibblespurrr 包。
  • 你不能用sapply(myDocs$drive_resource, "[[", "webViewLink")之类的东西吗?
  • 这有效@Alexis - 如果您将其发布为答案,我会接受它...

标签: r nested-lists


【解决方案1】:

正如来自purrr 的cmets map 中所说的那样可以工作。这是使用我经常使用的函数的替代方法:rvest::pluck

#
N <- 10
sample_list_data <- lapply(1:N, function(i){
  list(other = runif(3),
       webViewLink = sample(letters, 1))
})
myDocs <- data.frame(drive_resource = matrix(sample_list_data))

library(rvest)

myDocs$url <- unlist(pluck(myDocs$drive_resource, "webViewLink"))

library(microbenchmark)
microbenchmark("old" = {
  myDocs$url0 <- NA
  for (i in 1:nrow(myDocs)) {
    myDocs$url0[i] <- myDocs$drive_resource[[i]]$webViewLink
  }
}, 
"new" = {
  myDocs$url1 <- unlist(pluck(myDocs$drive_resource, "webViewLink"))
})

myDocs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 2020-05-21
    • 2016-12-16
    • 2018-05-28
    • 2012-04-20
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    相关资源
    最近更新 更多