【问题标题】:Formatting all columns using mutate_all in dplyr在 dplyr 中使用 mutate_all 格式化所有列
【发布时间】:2017-08-25 23:49:03
【问题描述】:

我正在研究使用scales::dollar within mutate_all 格式化表格。

期望的结果

使用sapply 可以获得所需的结果:

>> sapply(mtcars, scales::dollar)
      mpg      cyl  disp      hp     drat    wt      qsec     vs   am   gear carb
 [1,] "$21.00" "$6" "$160.00" "$110" "$3.90" "$2.62" "$16.46" "$0" "$1" "$4" "$4"
 [2,] "$21.00" "$6" "$160.00" "$110" "$3.90" "$2.88" "$17.02" "$0" "$1" "$4" "$4"
 [3,] "$22.80" "$4" "$108.00" "$93"  "$3.85" "$2.32" "$18.61" "$1" "$1" "$4" "$1"
 [4,] "$21.40" "$6" "$258.00" "$110" "$3.08" "$3.22" "$19.44" "$1" "$0" "$3" "$1"

挑战

尝试通过dplyr 管道 scales::dollar

获得相同的结果
mtcars %>% mutate_all(funs(scales::dollar(.)))

失败:

Error in vapply(dots[missing_names], function(x) make_name(x$expr), character(1)) : 
  values must be length 1,
 but FUN(X[[1]]) result is length 3

进一步探索

可以尝试原始的解决方法:

mtcars %>% mutate_each(funs(as.character(paste0("$", .))))

结果:

>> mtcars %>% mutate_each(funs(as.character(paste0("$", .))))
     mpg cyl   disp   hp  drat     wt   qsec vs am gear carb
1    $21  $6   $160 $110  $3.9  $2.62 $16.46 $0 $1   $4   $4
2    $21  $6   $160 $110  $3.9 $2.875 $17.02 $0 $1   $4   $4
3  $22.8  $4   $108  $93 $3.85  $2.32 $18.61 $1 $1   $4   $1

按照a similar discussion,,可以轻松地进一步开发该方法以创建所需的货币格式,但这不是重点。

问题

  • 为什么在mutate_all(或mutate_each)中应用scales::dollar(.) 会失败?什么时候 应用于矢量元素,它按预期工作,当在mutate_all/mutate_each 中传递时,不应该沿着列中可用的观察复制此行为:

    >> scales::dollar(c(1, 1e4)) 
    [1] "$1"      "$10,000"
    

【问题讨论】:

标签: r string formatting dplyr


【解决方案1】:

我们需要用as.character 包装,因为当我们在funs 中使用package::function 时,这似乎是一个错误。它记录在here

mtcars %>% 
     mutate_each(funs(as.character(scales::dollar(.))))

此外,基于@Frank 分享的博客链接,mutate_each 功能已被弃用,因此我们可以使用mutate_at

mtcars %>% 
       mutate_at(names(.), funs(as.character(scales::dollar(.))))

补救办法是加载包,然后在没有::的情况下调用

library(scales)
mtcars %>% 
    mutate_at(names(.), funs(dollar(.)))

或者

mtcars %>% 
        mutate_at(names(.), dollar)

【讨论】:

  • 非常感谢您的全面回答,我已参考mutate_all 更新了问题。关于属性,class(scales::dollar(10)) 返回characterstr 在同一对象上显示chr "$10";我怎样才能更好地询问生成的对象以避免将来出现类似的陷阱?
  • @Konrad 似乎是一个错误。更新了帖子
猜你喜欢
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多