当然,某些包装中必须有一个功能吗?
我已经搜索过了,我发现这个函数来计算模式:
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
但是我想要一个能让我轻松计算一列数据中第二/第三/第四/最常见值的函数。
最终,我会将此功能应用于大量dplyr::group_by()
s。
感谢您的帮助!
答案 0 :(得分:2)
也许你可以试试
f <- function (x) with(rle(sort(x)), values[order(lengths, decreasing = TRUE)])
这给出了通过降低频率排序的唯一向量值。第一个是模式,第二个是第二个最常见的等等。
另一种方法是基于table()
:
g <- function (x) as.numeric(names(sort(table(x), decreasing = TRUE)))
但不推荐这样做,因为输入向量x
将被强制首先考虑因素。如果你有一个大的矢量,这是非常慢的。退出时,我们必须提取字符名称和表格,并将其强制转换为数字。
示例强>
set.seed(0); x <- rpois(100, 10)
f(x)
# [1] 11 12 7 9 8 13 10 14 5 15 6 2 3 16
让我们与table
中的列联表进行比较:
tab <- sort(table(x), decreasing = TRUE)
# 11 12 7 9 8 13 10 14 5 15 6 2 3 16
# 14 14 11 11 10 10 9 7 5 4 2 1 1 1
as.numeric(names(tab))
# [1] 11 12 7 9 8 13 10 14 5 15 6 2 3 16
所以结果是一样的。