将成对类别组合在一起

时间:2017-10-19 22:31:57

标签: r matrix tapply

我目前正在处理一个数据集,其中显示贷款的目的,以及每笔贷款的相关贷款等级。

数据集名为 loancase ,其中一列是目的,而另一列是 grade enter image description here

下面我有一个矩阵,它将以成对方式按比例填充。每行应该总计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)))

enter image description here

如何实现以每个条目填写所需值的目标?我目前正在考虑使用tapply()但不知道如何实现。这是当前的代码,代替" NA"但现在不正确。

grades.per.purpose = tapply(loancase$grade, levels(loancase$purpose), sum)

2 个答案:

答案 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)