r - 将 data.frame 值更改为 %
问题描述
如何将包含 NA 值的 df 的值替换为对行总和的贡献百分比?
例子:
# dummy df
a <- c("x","y","z")
b <- c(10,5,2)
c <- c("NA",1,"NA")
d <- c("NA",4,8)
dummy <- data.frame(a,b,c,d)
一个 | b | C | |
---|---|---|---|
X | 10 | 不适用 | 不适用 |
是的 | 5 | 1 | 4 |
z | 2 | 不适用 | 8 |
我想要的是:
一个 | b | C | |
---|---|---|---|
X | 100% | 不适用 | 不适用 |
是的 | 50% | 10% | 40% |
z | 20% | 不适用 | 80% |
解决方案
首先,最好使用明确的 NA,而不是使用“NA”的字符串。
其次,您可以使用 dplyrrowwise()
和解决此问题across()
:
library(scales)
library(dplyr)
# dummy df with explict NAs
a <- c("x","y","z")
b <- c(10,5,2)
c <- c(NA,1, NA)
d <- c(NA, 4,8)
dummy <- data.frame(a,b,c,d)
dummy %>%
# add column of sum by row
rowwise() %>%
mutate(row_sum = sum(c_across(b:d), na.rm = TRUE),
# divide each column by sum of row
across(b:d, ~ percent(.x / row_sum))) %>%
ungroup() %>%
# remove sum column
select(-row_sum)
# A tibble: 3 x 4
# a b c d
# <chr> <chr> <chr> <chr>
# 1 x 100% NA NA
# 2 y 50% 10% 40%
# 3 z 20% NA 80%
推荐阅读
- odoo-12 - 销售订单行
- ruby-on-rails - 在 Rails 中查找具有多个列名的记录
- java - 使用 Gradle 运行 Java 时出现 ClassNotFoundException
- java - 使元素之和小于或等于 k 的方式总数
- flutter - 我如何重新创建颤振神社屏幕 ui(水平滚动)
- python-3.x - Pyside2:QSplitter replaceWidget 未按预期工作
- azure-active-directory - 如何使用 Microsoft Graph API 更新云用户的 extensionAttributes
- angular - ng serve 没有在正确的端口为 localhost 打开浏览器(chrome)
- npm - 在脚本定义中将 NPM 日志级别设置为“安静”
- bash - 从 ssh 会话中检测 user@hostname