基于 R 中的现有列创建多个百分比列

Gai*_*inz 0 r data.table

col2我想创建多个列来显示,col3和的每个元素的百分比Total。我想出的代码仅显示paste这些列中的百分比,而不是将其粘贴到新列中。我已经在堆栈和谷歌上搜索过,但没有找到我正在寻找的答案。

样本数据 :

data <- data.table(col1= c("A", "B", "C"),
                   col2= c(43,23,19),
                   col3= c(102,230,149))
data <- data[, Total := col2 + col3]
data <- janitor::adorn_title(data)

Output :

  col1 col2 col3 Total
    A   43  102   145
    B   23  230   253
    C   19  149   168
Total   85  481   566
Run Code Online (Sandbox Code Playgroud)

我的百分比函数:

add_percent <- function(dt, col_no_percent, col_percent){
  dt <- dt[
    , c(.SD[, col_no_percent, with=FALSE],
        lapply(.SD[, col_percent, with=FALSE], function(x){
          paste0(x, format(round(x / sum(x) * 100 * 2, 1), nsmall = 1, decimal.mark = "."))

        }))
    ]
}
Run Code Online (Sandbox Code Playgroud)

我的函数的数据输出:

data <- add_percent(data, "col1", c("col2", "col3", "Total"))
    col1    col2     col3    Total
       A 43 50.6 102 21.2 145 25.6
       B 23 27.1 230 47.8 253 44.7
       C 19 22.4 149 31.0 168 29.7
   Total 85 100.0 481 100.0 566 100.0
Run Code Online (Sandbox Code Playgroud)

我想要的数据输出:

  col1 col2 col3 Total col2.x col3.x Total.x
    A   43  102   145   50.6   21.2   25.6
    B   23  230   253   27.1   47.8   44.7
    C   19  149   168   22.4   31.0   29.7
Total   85  481   566  100.0  100.0  100.0
Run Code Online (Sandbox Code Playgroud)

我的数据可能会包含更多列,因此所有新列都必须“自动”创建。所以我想知道如何根据我的百分比函数生成这些列,或者如果可能的话甚至是更有效的方法。

谢谢。

Ice*_*can 5

初始数据。请注意,我删除了看门人步骤。最后会做这部分。

data <- data.table(col1= c("A", "B", "C"),
                   col2= c(43,23,19),
                   col3= c(102,230,149))
data <- data[, Total := col2 + col3]
Run Code Online (Sandbox Code Playgroud)

为所有数字列添加百分比列并添加“总计”行

cols <- names(data)[sapply(data, is.numeric)]

data[, paste0(cols, '_pct') := lapply(.SD, function(x) 100*x/sum(x))
   , .SDcols = cols]


adorn_totals(data)
 #  col1 col2 col3 Total  col2_pct  col3_pct Total_pct
 #     A   43  102   145  50.58824  21.20582  25.61837
 #     B   23  230   253  27.05882  47.81705  44.69965
 #     C   19  149   168  22.35294  30.97713  29.68198
 # Total   85  481   566 100.00000 100.00000 100.00000
Run Code Online (Sandbox Code Playgroud)