首页 > 解决方案 > 将 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%

标签: rdplyr

解决方案


首先,最好使用明确的 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% 

推荐阅读