R - 根据几个不同列和行中数据总和的计算百分比创建新列
R - Create New Columns from Calculated Percentages With Sum of Data in Several Different Columns & Rows
我希望从 data.frame df
中的列 Su
中获取值,并创建新列,其中包含与 [=] 中所有行的匹配类别相关的行的百分比13=]、Tr
、Sa
和 ST
从这里开始:
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
我希望从 data.frame df
中的列 Su
中获取值,并创建新列,其中包含与 [=] 中所有行的匹配类别相关的行的百分比13=]、Tr
、Sa
和 ST
从这里开始:
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