【问题标题】:add symbol % to all the data frame in R将符号 % 添加到 R 中的所有数据帧
【发布时间】:2021-02-17 07:12:54
【问题描述】:

我有一个像mt.per <- head(mtcars) 这样的数据集,我想在所有数据集中的每个单元格值的末尾添加%。提前谢谢了 预期答案

                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
    Mazda RX4         21.0%   6% 160% 110 % 3.90% 2.620% 16.46%  0%  1%    4% 4%
    Mazda RX4 Wag     21.0%   6%  160% 110% 3.90% 2.875% 17.02%  0%  1%    4% 4%
..... and so on

【问题讨论】:

  • 另一种选择:mt.per[] <- paste0(unlist(mt.per), "%")

标签: r string tidyr data-manipulation


【解决方案1】:

这是否工作,使用基础 R:

mt.per <- head(mtcars)
mt.per[] <- lapply(mt.per, function(x) paste0(x,'%'))
mt.per
                    mpg cyl disp   hp  drat     wt   qsec vs am gear carb
Mazda RX4           21%  6% 160% 110%  3.9%  2.62% 16.46% 0% 1%   4%   4%
Mazda RX4 Wag       21%  6% 160% 110%  3.9% 2.875% 17.02% 0% 1%   4%   4%
Datsun 710        22.8%  4% 108%  93% 3.85%  2.32% 18.61% 1% 1%   4%   1%
Hornet 4 Drive    21.4%  6% 258% 110% 3.08% 3.215% 19.44% 1% 0%   3%   1%
Hornet Sportabout 18.7%  8% 360% 175% 3.15%  3.44% 17.02% 0% 0%   3%   2%
Valiant           18.1%  6% 225% 105% 2.76%  3.46% 20.22% 1% 0%   3%   1%
> 

【讨论】:

  • 不需要匿名函数lapply(mt.per, paste0, "%")
【解决方案2】:

您可以使用下面的代码。 apply 允许您避免循环并将其MARGIN 参数设置为2 会将定义的函数应用于每一列(在apply 中表示为x)。由于paste 是矢量化的,因此每个单独的元素都将粘贴到列中。

mt.per <- head(mtcars)
res <- apply(mt.per, 2 , function(x) paste0(x,'%'))

【讨论】:

  • 这不如其他解决方案好,因为apply 转换为矩阵并返回matrix 类结果而不是数据框。出于这个原因,我更喜欢lapply 解决方案。
【解决方案3】:

这是一个简单的dplyr 解决方案:

mt.per %>% 
  mutate(across(everything(), ~paste0(., "%")))

【讨论】:

    【解决方案4】:

    scales 包有一个很好的函数叫做 percent,你可以很容易地改变几个参数,比如准确度。

    mt.per %>%
        mutate(across(where(is.numeric),~./100  )) %>%
        mutate(across(where(is.numeric),scales::percent, accuracy = 1))
    

    【讨论】:

      猜你喜欢
      • 2020-09-26
      • 2021-05-05
      • 2016-08-11
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 2014-06-28
      相关资源
      最近更新 更多