【问题标题】:Rename list elements which has names starting with specified characters using purrr package使用 purrr 包重命名名称以指定字符开头的列表元素
【发布时间】:2021-04-08 08:40:38
【问题描述】:

我有一个包含 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

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

【问题讨论】:

    标签: r list pipe rename purrr


    【解决方案1】:

    您可以通过以下方式实现您想要的。请注意,这要求您拥有最新版本的 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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2022-08-09
        • 1970-01-01
        • 2014-11-26
        • 1970-01-01
        • 1970-01-01
        • 2019-08-13
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多