【问题标题】:Group pairwise categories together将成对类别组合在一起
【发布时间】:2017-10-19 22:31:56
【问题描述】:

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

数据集称为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)

【问题讨论】:

  • 请以纯文本形式提供数据,而不是图像,以便用户复制/粘贴。
  • 添加相关代码行

标签: r matrix tapply


【解决方案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 的贷款是 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    

【讨论】:

  • 这正是我想要达到的结果,谢谢。不幸的是,出于这些目的,我不能使用任何外部库。有没有办法使用原生 R 函数来做到这一点?
  • @user1713336 如果允许使用外部库,R 会更容易使用。确定收不到包裹吗?
  • 我也很想使用库,但我不能在这个项目中使用它们。
  • @user1713336 我能想到的只是aggregate 用于汇总数据...我不确定将数据传播出去的干净方法。请编辑您的问题,以便 (1) 它包含有人可以复制粘贴的实际可用数据,以及 (2) 澄清您不允许使用包。
  • @lebelinoz - reshapedirection="wide" 等效于 spread
【解决方案2】:

虽然我认为禁止使用包是无稽之谈,但有一个base R 解决方案,最终结果以可能取悦 OP 的方式呈现。

xt <- xtabs(amount ~ grade + purpose, df)
t(xt)/colSums(xt)

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 2018-07-05
    • 2020-10-30
    • 2015-07-07
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多