【问题标题】:filtering nested dataframe (list column) over values in list with purrr使用 purrr 过滤列表中的值的嵌套数据框(列表列)
【发布时间】:2019-02-10 01:42:38
【问题描述】:

我有一个包含列表列的数据框。我想在其包含的列unit 上过滤此(嵌套)列表列(data,包含数据框),并使用另一个列表(x)中包含的值。我想我已经很接近了,问题是我没有成功将列表x“转换”为过滤器语句的向量。任何提示都很棒!

library(tidyverse)

数据框:

df<- structure(list(data = list(structure(list(unit = c("A1", "A2"
), value = c("10", "10")), class = c("tbl_df", "tbl", "data.frame"
), .Names = c("unit", "value"), row.names = c(NA, -2L)), structure(list(
  unit = c("B1", "B2", "A1"), value = c("10", "10", "10")), class = c("tbl_df", 
                                                                      "tbl", "data.frame"), .Names = c("unit", "value"), row.names = c(NA, 
                                                                                                                                       -3L)), structure(list(unit = c("C1", "B2"), value = c("10", "10"
                                                                                                                                       )), class = c("tbl_df", "tbl", "data.frame"), .Names = c("unit", 
                                                                                                                                                                            "value"), row.names = c(NA, -2L))), x = list(c("A1", "A2"), c("B1", 
                                                                                                                                                                                                                                                              "B2"), "C1")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                     -3L), .Names = c("data", "x"))

这仅适用于x 只有一个元素:

df1 <- df %>% 
  mutate(y=map(data, ~filter(., unit %in% x)))

flatten_chr 创建一个向量,包括所有 (!) 行的 x 中包含的值,而不是每行的列表。

df1 <- df %>% 
  mutate(y=map(data, ~filter(., unit %in% flatten_chr(x))))

关键问题似乎是如何将x 转换为每行的向量。

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    您可以使用map2() 来并行迭代datax,即逐行。

    df %>%
      mutate(y= map2(data, x, ~ filter(..1, unit %in% ..2))) # using ..1/..2 instead of .x/.y, to avoid confusion 
    
    # A tibble: 3 x 3
      data             x         y               
      <list>           <list>    <list>          
    1 <tibble [2 × 2]> <chr [2]> <tibble [2 × 2]>
    2 <tibble [3 × 2]> <chr [2]> <tibble [2 × 2]>
    3 <tibble [2 × 2]> <chr [1]> <tibble [1 × 2]>
    

    在此模式中,您不再需要 flatten_chr(),因为 x/..2 已经是映射函数内部的字符对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      相关资源
      最近更新 更多