R - 根据几个不同列和行中数据总和的计算百分比创建新列

R - Create New Columns from Calculated Percentages With Sum of Data in Several Different Columns & Rows

我希望从 data.frame df 中的列 Su 中获取值,并创建新列,其中包含与 [=] 中所有行的匹配类别相关的行的百分比13=]、TrSaST

从这里开始:

Ca Sa ST Tr Su A T1 S cn 3.2 A T2 S ct 1.7 C T1 S sn 2.1 H T3 R ct 1.4

为此:

Ca Sa ST Tr Su p_Sa p_ST p_Tr p_Ca A T1 S cn 3.2 60.4 45.7 100.0 65.3 A T2 S ct 1.7 100.0 24.2 54.8 34.7 C T1 S sn 2.1 39.6 30.0 100.0 100.0 H T3 R ct 1.4 100.0 100.0 45.2 100.0

其中 p_Sa 计算为 100*(Su 的值)/(Sa 列中具有相同模式的所有行的总和),或者 - 对于第一个条目:(100*(3.2/ (3.2+2.1))); p_ST = 100*(Su 的值)/(ST 列中具有相同模式的所有行的总和) 等等等等

我试过使用 ddply(df, .(Sa), transform, perc.Sa=Su/sum(Su)) 但我想我可能没有正确使用它并在我的实际 df 上得到这个错误,它比上面的例子有更多的行和一些额外的列:

Error: Column indexes must be at most 10 if positive, not 17, 35, 64, 79, 108, 128, 145, 173, 189, 230, 244, 255, 296, 310, 337, 353, 374, 408, 418, 441, 477, 493, 525, 551

非常感谢您提供的所有帮助。

dplyr 解决方案是 group_by 每一列。

library(dplyr)
df %>% group_by(Sa) %>% mutate(p_Sa = 100*Su/(sum(Su))) %>% ungroup %>%
  group_by(ST) %>%  mutate(p_ST = 100*Su/(sum(Su))) %>% ungroup %>%  
  group_by(Tr) %>%  mutate(p_Tr = 100*Su/(sum(Su))) %>% ungroup %>% 
  group_by(Ca) %>%  mutate(p_Ca = 100*Su/(sum(Su)))


# A tibble: 4 x 9
# Groups:   Ca [3]
#   Ca    Sa    ST    Tr       Su  p_Sa  p_ST  p_Tr  p_Ca
#   <fct> <fct> <fct> <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A     T1    S     cn      3.2  60.4  45.7 100    65.3
# 2 A     T2    S     ct      1.7 100    24.3  54.8  34.7
# 3 C     T1    S     sn      2.1  39.6  30   100   100  
# 4 H     T3    R     ct      1.4 100   100    45.2 100 

@jasbner 解决方案完全有效,但是,这里有一个更自动化的解决方案:

library(tidyverse)
library(reshape2)

df %>%
  rowid_to_column() %>%
  gather(var, val, -Su, -rowid) %>% 
  group_by(val) %>% 
  mutate(res = 100*Su/(sum(Su)),
         var2 = paste("p_", var, sep = "")) %>% 
  ungroup() %>% 
  dcast(rowid~var2, first, value.var = "res") %>% 
  right_join(df %>% rowid_to_column(), by = c("rowid" = "rowid")) %>% 
  select(-rowid)

        p_Ca      p_ST      p_Sa      p_Tr Ca Sa ST Tr  Su
1  65.30612  45.71429  60.37736 100.00000  A T1  S cn 3.2
2  34.69388  24.28571 100.00000  54.83871  A T2  S ct 1.7
3 100.00000  30.00000  39.62264 100.00000  C T1  S sn 2.1
4 100.00000 100.00000 100.00000  45.16129  H T3  R ct 1.4