我试图用main(?)的另一列中包含的值筛选嵌套的dataframe/list列数据帧.不幸的是,我下面的代码不起作用,我认为问题在于我在map_if中引用search_term的方式是不正确的.我怀疑它需要整个向量/列,而不是每行search_term的单个值.我使用map_if判断要筛选的嵌套数据框是否为空(判断的是nested_data_nrow中的行数).谢谢你的提示.非常感谢.在我的reprex下面.

library(tidyverse)
#> Warning: package 'dplyr' was built under R version 4.1.3
df_nest <- structure(list(nested_data = list(structure(list(places_bank_name = c(
  "ZiraatBank",
  "UniCredit Bank", "Sparkasse Bank", "Intesa Sanpaolo Banka",
  "Raiffeisen BANK", "EKI"
)), row.names = c(NA, -6L), class = c(
  "tbl_df",
  "tbl", "data.frame"
)), structure(list(places_bank_name = c(
  "Raiffeisen BANK (iPoslovnica)",
  "KIB Banka", "Raiffeisen BANK - Agencija Bužim", "BBI Bosna Bank International"
)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame")), structure(list(places_bank_name = "Casopis Financing"), row.names = c(
  NA,
  -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
  places_bank_name = "UniCredit Bank"
), row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame"))), nested_data_nrow = c(
  6,
  4, 1, 1
), search_term = c(
  "BBI|Bosna Banka", "Komercijalno-investiciona|KIB",
  "Raiffeisen", "UniCredit"
), bank_name = c(
  "Bosna Banka International",
  "Komercijalno-investiciona banka d.d. V.Kladusa", "Raiffeisen Bank d.d. BiH",
  "UniCredit d.d. Mostar"
)), row.names = c(NA, -4L), class = c(
  "tbl_df",
  "tbl", "data.frame"
))

df_nest
#> # A tibble: 4 x 4
#>   nested_data      nested_data_nrow search_term                   bank_name     
#>   <list>                      <dbl> <chr>                         <chr>         
#> 1 <tibble [6 x 1]>                6 BBI|Bosna Banka               Bosna Banka I~
#> 2 <tibble [4 x 1]>                4 Komercijalno-investiciona|KIB Komercijalno-~
#> 3 <tibble [1 x 1]>                1 Raiffeisen                    Raiffeisen Ba~
#> 4 <tibble [1 x 1]>                1 UniCredit                     UniCredit d.d~

df_nest_filtered <- df_nest %>%
  mutate(nest_data_filtered = map_if(
    nested_data,
    nested_data_nrow > 0,
    ~ .x %>%
      filter(str_detect(
        places_bank_name,
        regex(search_term, ignore_case = T)
      ))
  )) %>%
  mutate(nest_data_filtered_nrow = map_dbl(nest_data_filtered, nrow)) %>%
  select(bank_name, search_term, everything())
#> Warning in stri_detect_regex(string, pattern, negate = negate, opts_regex =
#> opts(pattern)): longer object length is not a multiple of shorter object length
#> Error in `mutate()`:
#> ! Problem while computing `nest_data_filtered = map_if(...)`.
#> Caused by error in `filter()`:
#> ! Problem while computing `..1 = str_detect(places_bank_name,
#>   regex(search_term, ignore_case = T))`.
#> x Input `..1` must be of size 1, not size 4.

reprex package(v2.0.1)于2022年4月13日创建

推荐答案

map_if中有多个列,这会产生长度问题,因为nested_data的每个元素都应该与相应的"搜索项"匹配.因此,pmap更好

library(dplyr)
library(purrr)
library(stringr)
df_nest2 <- df_nest %>%
   mutate(nest_data_filtered = pmap(across(
     c(nested_data, nested_data_nrow, search_term)), 
    ~ if(..2 > 0) ..1 %>%
     filter(str_detect(places_bank_name, 
      regex(..3, ignore_case = TRUE)) ) else ..1))

-输出

> df_nest2$search_term
[1] "BBI|Bosna Banka"     
[2] "Komercijalno-investiciona|KIB"
[3] "Raiffeisen"         
[4] "UniCredit"                    
> df_nest2$nest_data_filtered
[[1]]
# A tibble: 0 × 1
# … with 1 variable: places_bank_name <chr>

[[2]]
# A tibble: 1 × 1
  places_bank_name
  <chr>           
1 KIB Banka       

[[3]]
# A tibble: 0 × 1
# … with 1 variable: places_bank_name <chr>

[[4]]
# A tibble: 1 × 1
  places_bank_name
  <chr>           
1 UniCredit Bank  

或者另一个选项是map2case_when

df_nest %>%
   mutate(nest_data_filtered = case_when(nested_data_nrow > 0 
     ~ map2(nested_data, search_term,
    ~ .x %>% filter(str_detect(places_bank_name,
     regex(.y, ignore_case = TRUE)))), TRUE ~ nested_data))

R相关问答推荐

pivot_longer:names_to和names_pattern

R包terra在投影时如何决定模板格栅属性?

Select R中列未排序的收件箱中的最后一个按顺序编号的列

棒棒糖图表大小和线宽参数故障标签未出现

geom_raster不适用于x比例中超过2,15的值

混淆矩阵,其中每列和等于1

如何使用geom_sf在边界显示两种 colored颜色 ?

如何在R中正确对齐放射状图中的文本

带有gplot 2的十字舱口

如何在R中合并和合并多个rabrame?

如何编辑ggplot的图例字使用自定义对象(gtable)?'

R s iml包如何处理语法上无效的因子级别?'

多个过滤器内的一个盒子在仪表板Quarto

通过在colname中查找其相应值来创建列

为了网络分析目的,将数据框转换为长格式列联表

如何用书面利率绘制geom_bar图

如何识别倒排的行并在R中删除它们?

R+reprex:在呈现R标记文件时创建可重现的示例

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

如何将EC50值绘制在R中的剂量-react 曲线上?