【问题标题】:How to get the mode of a group in summarize in R如何在R中总结组的模式
【发布时间】:2015-08-03 19:45:00
【问题描述】:

我想比较来自两个不同索赔付款人的 CPT 代码成本。两者都有面值和非面值的供应商。我正在使用dplyrmodeest::mlv,但它没有按预期工作。这是一些示例数据;

source CPTCode ParNonPar Key         net_paid  PaidFreq seq
ABC   100       Y      ABC100Y  -341.00     6   1
ABC   100       Y      ABC100Y     0.00     2   2
ABC   100       Y      ABC100Y   341.00     6   3
XYZ   103       Y      XYZ103Y   740.28     1   1
XYZ   104       N      XYZ104N     0.00     2   1
XYZ   104       N      XYZ104N   401.82     1   2
XYZ   104       N      XYZ104N   726.18     1   3
XYZ   104       N      XYZ104N   893.00     1   4
XYZ   104       N      XYZ104N   928.20     2   5
XYZ   104       N      XYZ104N   940.00     2   6

和代码

str(data)
View(data)

## Expand frequency count to individual observations
n.times <- data$PaidAmounts
dataObs <- data[rep(seq_len(nrow(data)), n.times),]

## Calculate mean for each CPTCode (for mode use modeest library)
library(dplyr)
library(modeest)
dataSummary <- dataObs %>%
  group_by(ParNonPar, CPTCode) %>%
  summarise(mean = mean(net_paid),
            median=median(net_paid),
            mode = mlv(net_paid, method=mfv),
            total = sum(net_paid))
str(dataSummary)                     

我以为我可以在 summarise 函数中加载带有均值和中值的 modeest,但是这个公式会出错 as.character(x) 中的错误: 不能将类型“闭包”强制为“字符”类型的向量 如果没有 mlv,我会得到这样的 df,但我想要的是在一行上获取付款人 cpt 的所有统计信息。我设想通过限制 x 和 y 段在箱线图中绘制它,一旦我得到我需要的一行

不充分的答案是这个(我忘了在这里输入付款人姓名!)

ParNonPar   CPTCode mean          median(net_paid)  total
N           0513F   0.000000    0.000           0.00
N           0518F   0.000000    0.000           0.00 
N           10022   0.000000    0.000           0.00
N           10060   73.660000   90.120        294.64
N           10061   324.575000  340.500      1298.30
N           10081   312.000000  312.000       312.00

thanks very much for your time and effort.

【问题讨论】:

    标签: r statistics dplyr mode


    【解决方案1】:

    我使用这种方法:

    df <- data.frame(groups = c("A", "A", "A", "B", "B", "C", "C", "C", "D"), nums = c("1", "2", "1", "2", "3", "4", "5", "5", "1"))
    

    看起来像:

     groups nums
      A    1
      A    2
      A    1
      B    2
      B    3
      C    4
      C    5
      C    5
      D    1
    

    然后我定义:

    mode <- function(codes){
      which.max(tabulate(codes))
    }
    

    并执行以下操作:

    mds <- df %>%
      group_by(groups) %>%
      summarise(mode = mode(nums))
    

    给予:

      groups  mode
     A          1
     B          2
     C          5
     D          1
    

    【讨论】:

    • 如果你有因子并且希望模式使用因子标签,你可以将这种方法修改为:mode &lt;- function(x) { names(which.max(table(x))) }
    【解决方案2】:

    您需要对代码进行一些更改才能使 mlv 正常工作。

    1. 方法 (mfv) 必须在引号 ('mfv') 内。这就是导致您的错误的原因。
    2. 完成此操作后,由于 mlv 返回一个列表,因此您必须向 summarise() 提供一个值。假设您需要模式 ('M'),请从列表中选择该元素。

    试试:

    dataSummary <- dataObs %>%
      group_by(ParNonPar, CPTCode) %>%
      summarise(mean = mean(net_paid), 
                meadian=median(net_paid), 
                mode = mlv(net_paid, method='mfv')[['M']], 
                total = sum(net_paid))
    

    得到:

    > dataSummary
    Source: local data frame [3 x 6]
    Groups: ParNonPar
    
      ParNonPar CPTCode     mean meadian     mode   total
    1         N     104 639.7111  893.00 622.7333 5757.40
    2         Y     100   0.0000    0.00   0.0000    0.00
    3         Y     103 740.2800  740.28 740.2800  740.28
    

    希望能帮助你前进。

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      相关资源
      最近更新 更多