【问题标题】:Mapping the same function to multiple tibbles in a list将相同的函数映射到列表中的多个小标题
【发布时间】:2019-08-03 16:45:45
【问题描述】:

我有几个小标题,每个小标题都有不同的列数和不同的列名。我想将每个列的名称标准化为全部小写。这适用于单个小标题:

library(magrittr)
library(purrr)

colnames(tbl1) %<>% map(tolower)

对象 tbl1 的列名现在都是小写的。

但是,如果我将所有小玩意都放在一个列表中,这将不起作用:

all_tbls <- list(tbl1, tbl2, tbl3)
all_tbls %<>% map(function(tbl) {colnames(tbl) %<>% map(tolower)})

对象 tbl1、tbl2 和 tbl3 的列名不会因此而改变。列表 all_tbls 中的对象现在是每个 tbl 的列名列表,即如果您将 as.list() 应用于 colnames()) 的结果,您会得到什么。

为什么会这样?有没有更好的方法来做到这一点?为了与其他代码保持一致,我更喜欢使用 tidyverse 函数(例如 map 而不是 *apply),但我对其他解决方案持开放态度。编辑:明确地说,我希望能够使用原始 tibble 对象,即期望的结果是 tbl1、tbl2 和 tbl3 的 colnames 发生变化。

我查看但没有发现启发性的其他问答包括:

【问题讨论】:

    标签: r purrr magrittr


    【解决方案1】:
    library(magrittr)
    library(purrr)
    all_tbls %<>% map(~set_names(.x,tolower(colnames(.x))))
    

    列表 all_tbls 中的对象现在是每个 tbl 的列名列表

    因为您要求map 降低列名并将它们作为列表返回

    要就地修改,我们可以使用data.table::setnames,因为data.table 使用就地复制而不是引用复制。

    library(data.table)
    library(purrr)
    map(list(df1,df2),~setnames(.,old = names(.), new = tolower(names(.))))
    

    数据

    df1 <- read.table(text='
    A B
    1 1',header=TRUE)
    
    df2 <- read.table(text='
    C D
    2 2',header=TRUE)
    

    【讨论】:

      【解决方案2】:

      您正在映射的函数正在返回列名,您需要它来返回实际的 tibble:

      all_tbls %<>% map(function(tbl) { 
          colnames(tbl) %<>% map(tolower)
          tbl
      })
      

      【讨论】:

      • 这会更改列表中对象的列名,但不会更改原始底层对象。 (即 colnames(tbl1) 仍然是大小写混合的,但 colnames(all_tbls[[1]]) 现在都是小写的。)是否有一种简洁的方法来更改每个原始对象的 colnames?
      • 在 R 中“就地”更改对象有点棘手,就像在 Python 中一样,purrr 并不是真正设计用于这样做的,它是为函数式编程而设计的,您可以在其中应用函数并返回变换的对象。我现在能想到的唯一方法是搞乱get/assign,我通常不会推荐。
      【解决方案3】:

      你可以使用purrr::mapdplyr::rename_all

      all_tbls <- list(head(iris,2), head(cars,2))
      
      library(tidyverse)
      all_tbls %>% map(rename_all, toupper)
      # [[1]]
      #   SEPAL.LENGTH SEPAL.WIDTH PETAL.LENGTH PETAL.WIDTH SPECIES
      # 1          5.1         3.5          1.4         0.2  setosa
      # 2          4.9         3.0          1.4         0.2  setosa
      # 
      # [[2]]
      #   SPEED DIST
      # 1     4    2
      # 2     4   10
      # 
      

      【讨论】:

        猜你喜欢
        • 2014-06-07
        • 1970-01-01
        • 2017-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多