【问题标题】:googledrive4: How to filter a dribble (drive-tibble), applying criteria to nested list in a tibble?googledrive4:如何过滤运球(drive-tibble),将条件应用于tibble中的嵌套列表?
【发布时间】:2021-10-14 23:49:41
【问题描述】:

使用 googledrive4 包,访问 google drive 上的文件非常容易。

p_load(googledrive4, tidyverse)
dribble1 <- drive_ls()

> dribble1
# A dribble: 2000 × 3
  name           id                                drive_resource   
  <chr>          <drv_id>                          <list>           
1 somefile1.zip  1w76E2ze0p00jtxxxxxxxxxxxxxxxxxxx <named list [37]>
2 somefile2.zip  1Zau_jwYlDHFK4xxxxxxxxxxxxxxxxxxx <named list [37]>
...

但是,我正在努力根据嵌套在“drive_resource”命名列表中的参数过滤结果。 例如,我希望按日期时间过滤以创建一个仅包含在特定日期之后保存的文件的运球。

在绝望中,经过多次尝试和错误,我实现了我想要的,分两步:

p_load(tidyverse, lubridate)

# 1 - unnest to make a list of ID's that match my criteria
range <- interval(as_date("2021/1/1", now())

filtered_list <- dribble1 %>%
  unnest_longer(col = drive_resource) %>%
  filter(drive_resource_id == "modifiedTime") %>%
  unnest_longer(drive_resource, values_to = "modtime") %>%
  mutate(modtime = as_datetime(modtime)) %>%
  filter(modtime %within% range)

# 2 - filter the original dribble with filtered list of ID's
result_dribble <- dribble1 %>%
  filter(id %in% filtered_list$id)

这可行,但我觉得必须有更好的方法来更优雅地处理嵌套列表,而无需创建中间对象。

有人能解释一下吗?

(抱歉缺少reprex。dribble 是以一种我尚未完全理解的独特方式构建的,并且无法使用 datapasta 来重建包含嵌套命名列表的 dribble)

上面是一个简化的例子,我正在处理的数据要大得多, 我希望 RStudio 的屏幕截图对不熟悉 googledrive4 的人有意义。

【问题讨论】:

    标签: r tidyverse tibble nested-tibble


    【解决方案1】:

    经过一夜的思考,在hoist()找到了解决办法

    dribble1 %>% 
      hoist(drive_resource, "modifiedTime") %>%
      mutate(modifiedTime = as_datetime(modifiedTime)) %>%
      filter(modifiedTime %within% range)
    

    现在我的代码更短了,可以立即执行!

    作为一个侧节点,一开始我在尝试使用unnnest_wider时很吃力,但遇到了错误。

    > dribble1 %>% unnest_wider(col = drive_resource) 
    Error: Names must be unique.
    x These names are duplicated:
      * "name" at locations 1 and 6.
      * "id" at locations 2 and 5.
    ℹ Use argument `names_repair` to specify repair strategy.
    

    这很容易通过提供 names_repair 参数解决。

    > dribble1 %>% unnest_wider(col = drive_resource, names_repair = "unique") 
    

    这比 unnest_longer() 更可取,因为它保留了行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 2022-07-07
      • 1970-01-01
      • 2018-05-18
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多