【问题标题】:Select list element by name pattern in R在R中按名称模式选择列表元素
【发布时间】:2018-07-23 17:13:01
【问题描述】:

我有一个类似的列表

places <- list(
  'cities-1' = c('Madrid', 'Valencia', 'Barcelona'),
  'countries-1' = c('España', 'Portugal', 'Francia'),
  'cities-2' = c('Alicante', 'San Sebastian', 'Lugo'),
  'countries-2' = c('Italia', 'Grecia', 'Alemania')
)

我想创建一个新列表,其中包含他们的名称完成模式“城市”的那些元素。如果可能的话,我想使用 'tidyverse' 风格。

任何帮助将不胜感激。问候

【问题讨论】:

    标签: r regex list


    【解决方案1】:

    使用来自base R 的grep 更容易。通过检查list 的names 上的pattern 'cities' 来获取grepl 的逻辑索引,然后使用它来子集list 元素

    places[grepl("cities", names(places))]
    

    或使用tidyverse,而不是grepl,使用str_detect(来自stringr)和keep(来自purrr)满足条件的list元素

    library(tidyverse)
    names(places) %>% 
          str_detect('cities') %>%
          keep(places, .)
    

    正如@Frank 在 cmets 中提到的,tbl 或 data.frame 可能更便于分析

    data_frame(nm = names(places), places) %>% 
         unnest %>% 
         filter(str_detect(nm, "cities"))
    

    或在base R

    subset(stack(places), grepl("cities", ind))
    

    【讨论】:

    • 或者用表格代替列表data_frame(nm = names(places), places) %&gt;% unnest %&gt;% filter(str_detect(nm, "cities"))
    • 你的第二个例子也可以写成places %&gt;% keep(str_detect(names(.), 'cities')),我会觉得它更整洁一些。
    猜你喜欢
    • 2022-11-14
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多