[英]Group pairwise categories together
我目前正在处理一个数据集,其中显示了贷款目的以及每笔贷款的相关贷款等级。
该数据集称为Loancase ,其中一列是目的,而另一列是等级。
下面我有一个矩阵,该矩阵将以成对的方式按比例填充。 每行的总和应为 100%,这意味着每个条目是获得该等级的特定目的的比例。 例如, [Car, ]的行可能看起来像 20, 20, 0, 0, 20, 0, 40。
请注意,当前的数据占位符是 NA,我试图用列出每个所需条目的向量替换它。
matrix(data = NA, nrow = 14, ncol = 7, dimnames = list(levels(loancase$purpose), levels(loancase$grade)))
我如何实现用所需值填充每个条目的目标? 我目前在想我使用 tapply() 但不知道如何实现。 这是将代替“NA”的当前代码,但目前它不正确。
grades.per.purpose = tapply(loancase$grade, levels(loancase$purpose), sum)
由于您没有提供可用数据,我将制作一个玩具示例:
df = read.table(text = "grade purpose amount
A Car 100
B Car 200
C Car 100
A Moving 200
B Moving 50
B Moving 50", header = TRUE)
我们希望显示Car
贷款为 50% B 级、25% A 级和 C 级。 而Moving
贷款是67%的A级,33%的B级。
我喜欢使用dplyr
库进行这种分组和总结:
library(dplyr)
x = df %>%
group_by(purpose) %>%
mutate(purpose.total = sum(amount)) %>%
group_by(purpose, grade) %>%
summarise(percent = sum(amount / purpose.total))
结果:
purpose grade percent
1 Car A 0.2500000
2 Car B 0.5000000
3 Car C 0.2500000
4 Moving A 0.6666667
5 Moving B 0.3333333
要将其分组为您要求的正方形,请尝试使用tidyr
库:
tidyr::spread(x, key = grade, value = percent, fill = 0)
结果:
purpose A B C
1 Car 0.2500000 0.5000000 0.25
2 Moving 0.6666667 0.3333333 0.00
虽然我认为禁止使用包是无稽之谈,但有一个base R
解决方案,最终结果以可能取悦 OP 的方式呈现。
xt <- xtabs(amount ~ grade + purpose, df)
t(xt)/colSums(xt)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.