r - R中获取向量中元素频率向量的最简单方法

标签 r

假设我有一个值向量 v。获得长度等于 v 的向量 f 的最简单方法是什么,其中 f 的第 i 个元素是 v 在 v 中的第 i 个元素的频率?

我知道的唯一方法似乎不必要地复杂:

v = sample(1:10,100,replace=TRUE)
D = data.frame( idx=1:length(v), v=v )
E = merge( D, data.frame(table(v)) )
E = E[ with(E,order(idx)), ]
f = E$Freq

按照“频率(v)”的思路,肯定有一种更简单的方法可以做到这一点?

最佳答案

对于小正整数向量 v ,如在问题中,表达式

tabulate(v)[v]

特别简单,而且速度很快。

对于更一般的数值向量 v你可以说服ecdf帮助你,如
w <- sapply(v, ecdf(v)) * length(v)
tabulate(w)[w]

不过,自己对底层算法进行编码可能会更好——而且它肯定避免了前面解决方案中隐含的浮点舍入错误:
frequencies <- function(x) {
  i <- order(x)
  v <- x[i]
  w <- cumsum(c(TRUE, v[-1] != v[-length(x)]))
  f <- tabulate(w)[w]
  return(f[order(i)])
}

该算法对数据进行排序,在遇到这些值时为其分配顺序标识符 1、2、3...(通过对值发生变化的二进制指示符求和),使用前面的 tabulate()[]有效获取频率的技巧,然后对结果进行排序,使输出与输入匹配,逐个组件。

关于r - R中获取向量中元素频率向量的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30353392/

相关文章:

r - 使用 Predict() 时,预测变量数相同但行数不同的新数据会出现错误

R 对数据帧中的事件进行计数和减去

r - 如何将观察值乘以先前的观察值,但前提是某个条件为真

r - gtsummary - 分别呈现未知/缺失值的比例

r - 根据第一个的列值计算第二个数据表中的行而不合并

r - R中成对距离列表的距离矩阵

r - 在带有面的箱线图中绘制替代矩形(R,ggplot2)

r - 语句不在函数内执行,独立执行

r - 使用 rbindlist 时遇到错误 : column 25 of result is determined to be integer64 but maxType == 'Character' ! =REALSXP

删除条形之间的空格 ggplot2