如何在R中总结一个组的模式
How to get the mode of a group in summarize in R
我想比较来自两个不同索赔付款人的 CPT 代码的成本。两者都有平价和非平价供应商。我正在使用 dplyr
和 modeest::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)
我以为我可以在汇总函数中加载 modeest 的均值和中位数,但是这个公式出错了
as.character(x) 中的错误:
无法将类型 'closure' 强制转换为类型 'character' 的向量
如果没有 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.
您需要对代码进行一些更改,mlv 才能正常工作。
- 方法 (mfv) 必须在引号内 ('mfv')。这就是导致您出错的原因。
- 在你这样做之后,因为 mlv returns 一个列表,你必须将一个值提供给 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
希望能帮助您前进。
我使用这种方法:
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
我想比较来自两个不同索赔付款人的 CPT 代码的成本。两者都有平价和非平价供应商。我正在使用 dplyr
和 modeest::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)
我以为我可以在汇总函数中加载 modeest 的均值和中位数,但是这个公式出错了 as.character(x) 中的错误: 无法将类型 'closure' 强制转换为类型 'character' 的向量 如果没有 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.
您需要对代码进行一些更改,mlv 才能正常工作。
- 方法 (mfv) 必须在引号内 ('mfv')。这就是导致您出错的原因。
- 在你这样做之后,因为 mlv returns 一个列表,你必须将一个值提供给 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
希望能帮助您前进。
我使用这种方法:
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