在 R 中按名称模式选择列表元素

Arc*_*des 7 r list

我有一个像

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')
)
Run Code Online (Sandbox Code Playgroud)

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

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

akr*_*run 9

使用grepfrom更容易base R。获取逻辑指数与grepl通过检查pattern“城市”对nameslist,然后用它来子集list元素

places[grepl("cities", names(places))]
Run Code Online (Sandbox Code Playgroud)

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

library(tidyverse)
names(places) %>% 
      str_detect('cities') %>%
      keep(places, .)
Run Code Online (Sandbox Code Playgroud)

正如@Frank 在评论中提到的, a tblordata.frame可能更便于分析

data_frame(nm = names(places), places) %>% 
     unnest %>% 
     filter(str_detect(nm, "cities"))
Run Code Online (Sandbox Code Playgroud)

或者在 base R

subset(stack(places), grepl("cities", ind))
Run Code Online (Sandbox Code Playgroud)

  • 你的第二个例子也可以写成“places %&gt;% keep(str_detect(names(.), 'cities'))”,我觉得这样更整洁。 (2认同)