【问题标题】:How do I set the class of a variable using pipes?如何使用管道设置变量的类?
【发布时间】:2020-03-23 06:01:30
【问题描述】:

我创建了一个函数,可以从几个基本输入构建一个小标题

library(tidyverse)
fun <- function(x, y) {
  tibble(
    start = x) %>%
  mutate(k = x * y)
}

我想做的是在这个函数中设置每个变量的class

fun <- function(x, y) {
  tibble(
    start = x) %>%
  mutate(k = x * y) %>%
  mutate_at(vars(x, k), "currency")
}

我试过了

fun <- function(x, y) {
  tibble(
    start = x) %>%
  mutate(k = x * y) %>%
  class(k) <- "currency"
}

我的目标是创建一个包含类的 tibble,以便以后使用 openxlsx 包导出。我找到了很多使用 mutate_at 函数将因子转换为数字等的方法,但是找不到在它创建的同一函数中定义小标题(或数据框)变量类的方法。我知道我可以很容易地在脚本中做到这一点,但似乎我应该能够在函数中做到这一点。

【问题讨论】:

    标签: r class tidyverse tibble openxlsx


    【解决方案1】:

    "currency" 类来自哪里?我能找到的最接近的是formattable::currency(即使返回类"formattable" "numeric")。在这种情况下,你可以这样做:

    library(dplyr)
    
    fun <- function(x, y) {
    
      tibble(start = x) %>%
        mutate(k = x * y) %>%
        mutate_at(vars(start, k), formattable::currency)
    }
    
    fun(1:10, 2)
    # A tibble: 10 x 2
    #   start      k         
    #   <formttbl> <formttbl>
    # 1 $1.00      $2.00     
    # 2 $2.00      $4.00     
    # 3 $3.00      $6.00     
    # 4 $4.00      $8.00     
    # 5 $5.00      $10.00    
    # 6 $6.00      $12.00    
    # 7 $7.00      $14.00    
    # 8 $8.00      $16.00    
    # 9 $9.00      $18.00    
    #10 $10.00     $20.00    
    

    即使它来自一些不同的包,您也可以使用类中存在的默认方法执行相同的操作。例如,要将其更改为 "character" 类,您可以使用:

    fun <- function(x, y) {
       tibble(start = x) %>%
         mutate(k = x * y) %>%
         mutate_at(vars(start, k), as.character)
    }
    

    编辑

    fun <- function(x, y) {
    
      data <- tibble(start = x) %>% mutate(k = x * y)
      data[c('k', 'start')] <- lapply(data[c('k', 'start')], 
                                 function(x) {class(x) <- "Currency";x})
       return(data)
    }
    
    str(fun(1:10, 2))
    #Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  10 obs. of  2 variables:
    # $ start: 'Currency' int  1 2 3 4 5 6 7 8 9 10
    # $ k    : 'Currency' num  2 4 6 8 10 12 14 16 18 20
    

    【讨论】:

    • “货币”类来自openxlsx
    • 我尝试添加:mutate_at(vars(start, k), openxlsx::currency) 但它说“错误:'currency' 不是从 'namespace:openxlsx' 导出的对象”
    • 是否有另一种方法可以为数据框中的多个对象设置类? class(vars(df$start, k)) &lt;- "currency"
    • 谢谢罗纳克。我已经习惯了 Tidyverse,忘记了使用老派技能。感谢您的帮助。
    • 如果你想留在tidyverse,你可以把lapply改成map,效果一样。
    猜你喜欢
    • 2019-08-23
    • 1970-01-01
    • 2021-12-10
    • 2020-04-02
    • 2019-11-06
    • 2018-01-26
    • 2013-02-03
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多