R:如何找到向量的模式[重复]
Posted
技术标签:
【中文标题】R:如何找到向量的模式[重复]【英文标题】:R: how to find the mode of a vector [duplicate] 【发布时间】:2015-10-02 17:24:37 【问题描述】:下面是我的data.frame
,我想知道每个内存类别(1 到 8)的模式是什么
> dput(d)
structure(list(MEMORY1 = c(5.5, 7, 1.5, 6, 4.5, 4.5, 5, 4, 1,
5.5, 2.5, 4.5, 2.5, 5.5, 4, 1, 4, 5, 2.5, 5.5), MEMORY2 = c(5.5,
3, 1.5, 6, 4.5, 4.5, 5, 4, 5, 5.5, 6.5, 4.5, 2.5, 5.5, 4, 7,
8, 5, 6.5, 5.5), MEMORY3 = c(5.5, 3, 4.5, 2, 4.5, 4.5, 5, 4,
5, 1.5, 6.5, 4.5, 6.5, 5.5, 4, 7, 4, 5, 6.5, 5.5), MEMORY4 = c(1.5,
3, 4.5, 2, 1, 4.5, 5, 4, 5, 5.5, 2.5, 4.5, 2.5, 1.5, 4, 2, 4,
5, 2.5, 1.5), MEMORY5 = c(5.5, 3, 4.5, 6, 4.5, 4.5, 5, 1, 5,
5.5, 6.5, 4.5, 6.5, 5.5, 4, 4, 4, 5, 2.5, 1.5), MEMORY6 = c(5.5,
7, 7.5, 6, 8, 4.5, 5, 7.5, 5, 5.5, 6.5, 4.5, 6.5, 5.5, 4, 4,
4, 5, 2.5, 5.5), MEMORY7 = c(1.5, 3, 4.5, 2, 4.5, 4.5, 1, 4,
5, 1.5, 2.5, 4.5, 6.5, 1.5, 4, 7, 4, 1, 6.5, 5.5), MEMORY8 = c(5.5,
7, 7.5, 6, 4.5, 4.5, 5, 7.5, 5, 5.5, 2.5, 4.5, 2.5, 5.5, 8, 4,
4, 5, 6.5, 5.5)), .Names = c("MEMORY1", "MEMORY2", "MEMORY3",
"MEMORY4", "MEMORY5", "MEMORY6", "MEMORY7", "MEMORY8"), row.names = c(492L,
509L, 510L, 518L, 519L, 522L, 527L, 533L, 535L, 542L, 543L, 557L,
558L, 560L, 567L, 569L, 578L, 581L, 582L, 584L), class = "data.frame")
请忽略第一个未命名的列,因为它与此处无关。
> d
MEMORY1 MEMORY2 MEMORY3 MEMORY4 MEMORY5 MEMORY6 MEMORY7 MEMORY8
492 5.5 5.5 5.5 1.5 5.5 5.5 1.5 5.5
509 7.0 3.0 3.0 3.0 3.0 7.0 3.0 7.0
510 1.5 1.5 4.5 4.5 4.5 7.5 4.5 7.5
518 6.0 6.0 2.0 2.0 6.0 6.0 2.0 6.0
519 4.5 4.5 4.5 1.0 4.5 8.0 4.5 4.5
522 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5
527 5.0 5.0 5.0 5.0 5.0 5.0 1.0 5.0
533 4.0 4.0 4.0 4.0 1.0 7.5 4.0 7.5
535 1.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0
542 5.5 5.5 1.5 5.5 5.5 5.5 1.5 5.5
543 2.5 6.5 6.5 2.5 6.5 6.5 2.5 2.5
557 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5
558 2.5 2.5 6.5 2.5 6.5 6.5 6.5 2.5
560 5.5 5.5 5.5 1.5 5.5 5.5 1.5 5.5
567 4.0 4.0 4.0 4.0 4.0 4.0 4.0 8.0
569 1.0 7.0 7.0 2.0 4.0 4.0 7.0 4.0
578 4.0 8.0 4.0 4.0 4.0 4.0 4.0 4.0
581 5.0 5.0 5.0 5.0 5.0 5.0 1.0 5.0
582 2.5 6.5 6.5 2.5 2.5 2.5 6.5 6.5
584 5.5 5.5 5.5 1.5 1.5 5.5 5.5 5.5
如果我将 MEMORY1 的值制成表格,我会得到以下信息:
> table(d$MEMORY1)
1 1.5 2.5 4 4.5 5 5.5 6 7
2 1 3 3 3 2 4 1 1
所以我可以看到这里的模式是 5.5,我尝试了as.numeric(names(table(d$MEMORY1))[which.max(table(d$MEMORY1))])
,它确实返回了 5.5。这非常笨拙,我如何在我的data.frame
的所有 8 列中迭代它?我想要包含 8 种模式的结果向量(一个对应于每一列)。有什么优雅的方法可以做到这一点?
【问题讨论】:
【参考方案1】:post 提供了一个优雅的函数来确定模式,因此您只需将其应用于数据框即可。
Mode <- function(x)
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
apply(d, 2, Mode)
产量:
MEMORY1 MEMORY2 MEMORY3 MEMORY4 MEMORY5 MEMORY6 MEMORY7 MEMORY8
5.5 5.5 4.5 1.5 4.5 5.5 4.5 5.5
【讨论】:
以上是关于R:如何找到向量的模式[重复]的主要内容,如果未能解决你的问题,请参考以下文章