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

11
  • Apples
  • Bananas
  • Oranges

我有一个像这样的列表。
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”风格。

任何帮助都将不胜感激。 致敬

1个回答

15

使用 base R 中的 grep 更容易。使用 grepl 检查 listnames 上的 pattern 'cities',并获得一个逻辑索引,然后使用该索引来对 list 元素进行子集处理。

places[grepl("cities", names(places))]
或者使用 tidyverse,而不是 grepl,使用 stringr 中的 str_detectpurrr 中的 keep,保留满足条件的 list 元素。
library(tidyverse)
names(places) %>% 
      str_detect('cities') %>%
      keep(places, .)
如评论中@Frank所提到的,为了分析而言,使用tbldata.frame可能更为便利。
data_frame(nm = names(places), places) %>% 
     unnest %>% 
     filter(str_detect(nm, "cities"))

或者用基本R

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

1
或者制作一个表格而不是列表 data_frame(nm = names(places), places) %>% unnest %>% filter(str_detect(nm, "cities")) - Frank
2
你的第二个例子也可以写成 places %>% keep(str_detect(names(.), 'cities')),我觉得这样更简洁。 - Dan Chaltiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接