首页 > 解决方案 > 使用 purrr 包重命名名称以指定字符开头的列表元素

问题描述

我有一个包含元素名称的列表,例如x.height, x.weight, y.height, y.length, z.weight, z.price我想提取名称以开头的元素"x."并通过删除它们的前缀来重命名这些元素"x."。这可以分两步完成:

list.new <- list.old %>% keep(str_detect(names(.), "^x.")) 
names(list.new) <- str_replace(names(list.new), "x", "")

我的第一个问题:如何在管道中结合这两个步骤?

最后,我想处理所有不同前缀的"y.", "z."列表,以获得一个新列表,其中包含重命名的子列表,例如:

List of 3
 $ x:List of 2
  ..$ height: num 100
  ..$ weight: num 200
 $ y:List of 2
  ..$ height: num 300
  ..$ length: num 400
 $ z:List of 2
  ..$ weight: num 500
  ..$ price: num 600

是否可以使用单个管道来执行此操作?

标签: rlistpiperenamepurrr

解决方案


您可以简单地使用setNames()or set_names()

list.old <- list(
  x.height=1, x.weight=2, y.height=3, y.length=4, z.weight=5, z.price=6
)

list.old %>%
  keep(startsWith(names(.), prefix)) %>%
  set_names(str_replace(names(.), prefix, ""))
# $height
# [1] 1
# 
# $weight
# [1] 2

要应用于许多前缀,请将前面的代码用作函数:

prefix_list <- c("x","y","z")

map(prefix_list,
    function(prefix) list.old %>%
      keep(startsWith(names(.), prefix)) %>%
      set_names(str_replace(names(.), prefix, ""))
) %>%
  set_names(prefix_list)
# $x
# $x$.height
# [1] 1
# 
# $x$.weight
# [1] 2
# 
# 
# $y
# $y$.height
# [1] 3
# 
# $y$.length
# [1] 4
# 
# 
# $z
# $z$.weight
# [1] 5
# 
# $z$.price
# [1] 6

推荐阅读