r - 根据 R 中的现有列创建多个百分比列
问题描述
我想创建多个列来显示 和 的每个元素的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
我的百分比函数:
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
我的数据可能包含更多列,因此必须“自动”创建所有新列。所以我想知道如何根据我的百分比函数生成这些列,或者如果可能的话甚至更有效的方法。
谢谢你。
解决方案
初始数据。注意我删除了看门人步骤。最后会做那部分。
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
推荐阅读
- anaconda - 为什么anaconda在创建新环境时会重新下载我已经拥有的包?
- python - 如何为熊猫数据框添加标题
- xcode - 有没有办法修复滚动
- mongodb - Mongodb $lookup 与聚合查询中的条件
- react-native - 子组件更新时更改父状态
- vue.js - Electron JS事件多次触发
- c# - 当 ActiveMQ 中有新消息时,我们可以使用 HttpClient (SocketsHttpHandler) 像 TCP/IP 一样自动获得通知吗?
- powershell - 如何确定文件在 PowerShell 中是制表符分隔的?
- javascript - select2 on select data-select2-id 属性在选择选项之前添加到所有 div
- python - 从 bonobo etl 记录到文件