我目前正在处理一个数据集,其中显示贷款的目的,以及每笔贷款的相关贷款等级。
数据集名为 loancase ,其中一列是目的,而另一列是 grade 。
下面我有一个矩阵,它将以成对方式按比例填充。每行应该总计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)
答案 0 :(得分:1)
由于您没有提供可用的数据,我将构成一个玩具示例:
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
贷款的A级为67%,B级为33%。
我喜欢使用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
答案 1 :(得分:1)
虽然我认为禁止使用软件包是无稽之谈,但有一个base R
解决方案,最终结果以可能取悦OP的方式呈现。
xt <- xtabs(amount ~ grade + purpose, df)
t(xt)/colSums(xt)