首页 > 解决方案 > 根据 R 中的现有列创建多个百分比列

问题描述

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

样本数据 :

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

我的百分比函数:

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 = "."))

        }))
    ]
}

使用我的函数输出数据:

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

我想要的数据输出:

  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

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

谢谢你。

标签: rdata.table

解决方案


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

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

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

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

推荐阅读