【问题标题】:Extracting elements of nested list by contained value using purrr使用 purrr 通过包含值提取嵌套列表的元素
【发布时间】:2019-02-16 22:38:50
【问题描述】:

我有一个嵌套列表,其中每个嵌套列表都有相同的元素,但顺序不同,并且元素没有明确命名,但在列表中确实有一个名称值。

正如您在结构中看到的那样,包含“日期”字段的列表出现在第一个列表的第二个位置和第二个列表的第三个位置,所以我无法在某个位置提取。

我想提取name :Date 的列表,并使用purrr 包保留与其关联的值。

结构

dplyr::glimpse(my_list)
List of 2
 $ :List of 10
  ..$ :List of 2
  .. ..$ name : chr "MIME-Version"
  .. ..$ value: chr "1.0"
  ..$ :List of 2
  .. ..$ name : chr "Date"
  .. ..$ value: chr "Wed, 13 Feb 2019 15:20:40 -0800"
  ..$ :List of 2
  .. ..$ name : chr "References"
  .. ..$ value: chr "<CAE1g-C7AmC3zoJRG_UgdwwkkSiJMuEuDYLU1j4ni0MZJXNrGNQ@mail.gmail.com>"
  ..$ :List of 2
  .. ..$ name : chr "In-Reply-To"
  .. ..$ value: chr "<CAE1g-C7AmC3zoJRG_UgdwwkkSiJMuEuDYLU1j4ni0MZJXNrGNQ@mail.gmail.com>"
  ..$ :List of 2
  .. ..$ name : chr "Message-ID"
  .. ..$ value: chr "<CAPApPh+WZszKg_bjQBPrS8TOvLA23hQkaa9Hocb_cgrQYs2R1w@mail.gmail.com>"
  ..$ :List of 2
  .. ..$ name : chr "Subject"
  .. ..$ value: chr "Re:"
  ..$ :List of 2
  .. ..$ name : chr "From"
  .. ..$ value: chr ""
  ..$ :List of 2
  .. ..$ name : chr "To"
  .. ..$ value: chr ""
  ..$ :List of 2
  .. ..$ name : chr "Cc"
  .. ..$ value: chr ""
  ..$ :List of 2
  .. ..$ name : chr "Content-Type"
  .. ..$ value: chr "multipart/alternative; boundary=\"000000000000f3d8810581cec99d\""
 $ :List of 7
  ..$ :List of 2
  .. ..$ name : chr "MIME-Version"
  .. ..$ value: chr "1.0"
  ..$ :List of 2
  .. ..$ name : chr "Message-ID"
  .. ..$ value: chr "<CAPApPh+THbnCg2e5WmKEwQwHEEjKDHq3V6LkYV9oL88DbHE9Pg@mail.gmail.com>"
  ..$ :List of 2
  .. ..$ name : chr "Date"
  .. ..$ value: chr "Wed, 13 Feb 2019 12:18:32 -0800"
  ..$ :List of 2
  .. ..$ name : chr "Subject"
  .. ..$ value: chr ""
  ..$ :List of 2
  .. ..$ name : chr "From"
  .. ..$ value: chr "Daniel Seneca <senecad@gene.com>"
  ..$ :List of 2
  .. ..$ name : chr "To"
  .. ..$ value: chr "Daniel Seneca <seneca.daniel@gene.com>"
  ..$ :List of 2
  .. ..$ name : chr "Content-Type"
  .. ..$ value: chr "multipart/mixed; boundary=\"000000000000f11ad10581cc3e85\""

数据

my_list <-list(list(list(name = "MIME-Version", value = "1.0"), list(name = "Date", value = "Wed, 13 Feb 2019 15:20:40 -0800"), list(name = "References", value = "<CAE1g-C7AmC3zoJRG_UgdwwkkSiJMuEuDYLU1j4ni0MZJXNrGNQ@mail.gmail.com>"), list(name = "In-Reply-To", value = "<CAE1g-C7AmC3zoJRG_UgdwwkkSiJMuEuDYLU1j4ni0MZJXNrGNQ@mail.gmail.com>"),list(name = "Message-ID", value = "<CAPApPh+WZszKg_bjQBPrS8TOvLA23hQkaa9Hocb_cgrQYs2R1w@mail.gmail.com>"), list(name = "Subject", value = "Re:"), list(name = "From", value = ""),list(name = "To", value = ""),list(name = "Cc", value = ""),list(name = "Content-Type", value = "multipart/alternative; boundary=\"000000000000f3d8810581cec99d\"")),
               list(list(name = "MIME-Version", value = "1.0"), list(name = "Message-ID",value = "<CAPApPh+THbnCg2e5WmKEwQwHEEjKDHq3V6LkYV9oL88DbHE9Pg@mail.gmail.com>"),list(name = "Date",value = "Wed, 13 Feb 2019 12:18:32 -0800"), list(name = "Subject", value = ""), list(name = "From",value = "Daniel Seneca <senecad@gene.com>"), list(name = "To", value = "Daniel Seneca <seneca.daniel@gene.com>"),list(name = "Content-Type", value = "multipart/mixed; boundary=\"000000000000f11ad10581cc3e85\"")))

【问题讨论】:

标签: r purrr


【解决方案1】:

这个问题没有定义输出应该是什么样子,所以我们假设它应该是一个列表列表。如图所示,使用flatten 删除第一层,然后使用keep 过滤其元素。

library(purrr)
my_list %>% 
  flatten %>%
  keep(~ .x$name == "Date")

在基数 R 中可以这样写:

Filter(function(x) x$name == "Date", do.call("c", my_list))

【讨论】:

  • 我最终使用my_list %&gt;% modify_depth(1, ~ keep(., ~.x$name == "Date")) 来维护列表结构。但是你的回答很完美。
猜你喜欢
  • 2016-04-17
  • 2019-09-30
  • 2021-12-13
  • 2021-01-13
  • 2020-12-22
  • 1970-01-01
  • 2021-04-17
  • 2018-06-12
  • 1970-01-01
相关资源
最近更新 更多