【问题标题】:Using aggregate on data sorted by frequency对按频率排序的数据使用聚合
【发布时间】:2016-06-02 13:49:07
【问题描述】:

通过在我的数据框clean_data 上使用这个 R 命令,我可以获得前 100 个最常见的诊断。

head(sort(table(clean_data$Diagnosis),decreasing = TRUE),n = 100)

我可以获得每个诊断的平均“索赔金额”,如下所示:

aggregate(clean_data$Claimed.Amount,list(clean_data$Diagnosis),mean)

但它们在诊断字段中按字母顺序排列。

我如何结合这两种方法来获得按诊断分组但按顶部最常见的排序的聚合平均列表。只说频率排名前 100 的诊断。

【问题讨论】:

  • 听起来像是按列对 data.frame 进行的常见排序。你试过什么?
  • @RomanLuštrik 如果我将aggregate 命令的输出存储在一个临时数据框中,我会丢失table 命令生成的计数信息。如何使用第二个中的信息对第一个进行排序?

标签: r sorting dataframe aggregate


【解决方案1】:

重新格式化您的问题

您真的应该学会以简单、可重复的方式向您提问。例如,我认为这是对您的问题的等效描述:

set.seed(0)  ## set random seed for reproducibility
## some toy data, open access to everyone to play with
## use simply variable name `x`, `y`, `foo`, not those from special context
foo <- data.frame(y = runif(100),
                  x = sample(letters[1:4], 100, replace = TRUE))
## result from table:
sort(table(foo$x), decreasing = TRUE)

 # c  b  a  d 
 # 33 25 21 21 

## your call to aggregation
aggregate(y ~ x, foo, mean)

## the undesired output you see
  x         y
1 a 0.5537179
2 b 0.5263702
3 c 0.4358863
4 d 0.6145186

这是你想要的输出:

  x         y
1 c 0.4358863
2 b 0.5263702
3 a 0.5537179
4 d 0.6145186

如果您以上述方式提出问题,人们更容易理解和帮助。这种转变是一项重要的技能。

一种可能的解决方案

你可以试试这个:

## store the result of table() and aggregate()
count <- sort(table(foo$x), decreasing = TRUE)
oo <- aggregate(y ~ x, foo, mean)
## reordering
oo <- oo[match(names(count), oo$x), ]
rownames(oo) <- 1:length(count)

  x         y
1 c 0.4358863
2 b 0.5263702
3 a 0.5537179
4 d 0.6145186

如果您想将count 附加到oo,请执行以下操作:

oo$count <- as.integer(count)
oo

  x         y count
1 c 0.4358863    33
2 b 0.5263702    25
3 a 0.5537179    21
4 d 0.6145186    21

【讨论】:

  • 谢谢!这是我缺少的成语。 [match(oo$x, names(count)), ] 我会尽量按照你的建议发帖。有时制作玩具示例的风险是引入了第二个无意的错误,所以我避免了这种情况。
  • 嗯....似乎不适用于我的情况。不知道我做错了什么。我尝试了您的简化示例,效果很好。
  • 我的aggregate 电话与您的电话略有不同有关系吗? aggregate(clean_data[,c("Claimed.Amount","Paid.Amount")],list(clean_data$Diagnosis),mean) 即我没有使用公式表示法
  • 是的,三列。 Group.1, Claimed.Amount & Paid.Amount。没有错误消息,但它只是以奇怪的顺序生成行。还没有看到它产生的顺序的模式。基本上我进入oo的Diagnosis的顺序与我在counts中看到的不同。
  • 感谢您的耐心帮助我进行此调试! colnames(foo) 是 [1] "Group.1" "Claimed.Amount" "Paid.Amount" 。 nrow(foo) 给出 [1] 619。length(count) 给出 [1] 619
猜你喜欢
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2020-02-06
  • 2021-07-28
  • 2020-10-19
相关资源
最近更新 更多