微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 purrr 包重命名名称以指定字符开头的列表元素

如何解决使用 purrr 包重命名名称以指定字符开头的列表元素

我有一个包含元素名称的列表,例如 For myIndex = 0 to ubound(aoC) step 2 我想提取名称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."

是否可以使用单个管道来做到这一点?

解决方法

您可以通过以下方式实现您想要的。请注意,这要求您拥有最新版本的 dplyr 软件包 (>= 1.0.0)。

library(dplyr)
library(stringr)
library(purrr)

list.old <- list(
  x = list(x.height = 100,x.weight = 200),y = list(y.height = 300,y.length = 400),z = list(z.weight = 500,z.price = 600)
)

list.new <- list.old %>%
  map(as_tibble) %>%
  map(~ rename_with(.x,~ str_remove(.x,"^[xyz]\\."))) %>%
  map(as.list)

str(list.new)

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
,

您可以简单地使用 setNames()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(.),""))
) %>%
  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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。