【问题标题】:How to rename a column within my own function using a higher-order function?如何使用高阶函数重命名我自己的函数中的列?
【发布时间】:2020-09-26 20:34:34
【问题描述】:

概述

我的列中的观察值都用大写字母表示,例如“NORWALK”。但是,我编写了一个函数来转换观察结果,因此它们只有首字母大写,例如“Norwalk”。

代码

library(dplyr)
capitalizeColumn <- function(dataSet, c) { # c for column
  dataSet%>%
    mutate(c = tolower({{c}}))%>%
    mutate(c = toTitleCase(c))
}
df3 <- df3 %>%
  capitalizeColumn(ResidenceCity)%>%
  rename_all(recode, c= "ResidenceCity")

但是,此代码输出一个名为“c”的列,而我希望它输出原始列的名称,在本例中为“ResidenceCity”。现在我必须使用函数 rename_all 稍后重命名该列,但我希望它在我的 capitalizeColumn 函数中。我尝试在我的函数中使用一些不同的高阶函数,但到目前为止没有任何效果。

【问题讨论】:

  • 请展示一个可重现的小例子。 IIN你需要的功能dataSet %&gt;% mutate(!! c := tolower({{c}} %&gt;% toTitleCase)
  • {r} f1 &lt;- tibble( ResidenceCity = "NORWALK") f1
  • {r} capitalizeColumn(f1, ResidenceCity)
  • 你能显示toTitleCase函数所属的包
  • 它来自库(工具)

标签: r function dplyr rename capitalization


【解决方案1】:

@akrun 的答案是基于dplyr 的解决方案的正确答案(我赞成),但有时由于 tidyverse 依赖于非标准评估,Base R 中的事情比 tidyverse 更容易。这是处理数据框中多列的函数的 Base R 版本。

city <- c("CHICAGO","NEW YORK","LOS ANGELES", "DETROIT")
state <- c("ILLINOIS","NEW YORK","CALIFORNIA","MICHIGAN")
data <- data.frame(city,state,stringsAsFactors = FALSE)
capitalizeColumns <- function(df,vars){
     require(tools)
     for(v in vars) df[[v]] <- toTitleCase(tolower(df[[v]]))
     df
}
capitalizeColumns(data,c("city","state"))

...和输出:

> capitalizeColumns(data,c("city","state"))
         city      state
1     Chicago   Illinois
2    New York   New York
3 Los Angeles California
4     Detroit   Michigan
> 

【讨论】:

    【解决方案2】:

    我们可能需要执行赋值运算符 (:=) 而不是 = 以及评估“lhs”上的“c”

    capitalizeColumn <- function(dataSet, c) { 
      dataSet%>%
        mutate(!! enquo(c) := tolower({{c}}) %>% tools::toTitleCase(.))
    
            }
    
    
    capitalizeColumn(df1, ResidenceCity) 
    # A tibble: 1 x 1
    #  ResidenceCity
    #  <chr>        
    #1 Norwalk      
    

    数据

    df1 <- tibble( ResidenceCity = "NORWALK")
    

    【讨论】:

      【解决方案3】:

      在 dplyr 1.0 中,我们可以使用 mutate/across 将 cross 的第二个参数中指定的函数应用于第一个参数中指定的一个或多个列。

      library(dplyr)
      library(tools)
      
      capitalizeColumn <- function(data, c) {
        data %>% 
          mutate(across({{c}}, . %>% tolower %>% toTitleCase))
      }
      
      
      df3 <- data.frame(ResidenceCity = "NORWALK")
      capitalizeColumn(df3, ResidenceCity)
      ##   ResidenceCity
      ## 1       Norwalk
      

      在 dplyr 的早期版本中(以及在 1.0 中,虽然不太受欢迎)可以使用 mutate_at:

      capitalizeColumn <- function(data, c) {
        data %>% 
          mutate_at(vars({{c}}), . %>% tolower %>% toTitleCase)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2018-07-27
        • 2016-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多