用于在R中找到特殊比率的函数

时间:2014-02-04 05:42:39

标签: r

我有一个向量v,例如

    v = c(0, 0, 1, 1, 1.5, 2, 2, 2, 5, 5, 5, 5, 5, 5, 10)
    res = rep(0, length(unique(v)))
    for(i in 1:(length(unique(v)))){
       res[i] = sum(v == i) / sum(v > i)
    }
   > res
  [1] 0.1818182 0.4285714 0.0000000 0.0000000 6.0000000
  [6] 0.0000000

欲望结果如下:

    res = c(2/13, 2/11, 1/10, 3/7, 6/1, 10/0) 

如何在R中编写一个能产生所需结果的函数?

3 个答案:

答案 0 :(得分:2)

您的主要问题是i不一定是v的元素。它只是您创建的索引。部分问题是您需要该索引,因为您尝试使用for循环,因此您需要知道结果向量中的哪个位置存储结果,但实际上您还需要确保从中获取适当的值进行比较时的唯一值(即不直接与i比较)。

我会考虑这样做,以避免必须预先分配结果向量

v <- c(0, 0, 1, 1, 1.5, 2, 2, 2, 5, 5, 5, 5, 5, 5, 10)
u <- unique(v)
sapply(u, function(i){sum(v == i)/sum(v > i)}) # can store into res if you want
#[1] 0.1538462 0.1818182 0.1000000 0.4285714 6.0000000       Inf

请注意,这里的sapply是将u的元素(这是v中的唯一值)传递给我定义的匿名函数,因此比较实际上正在执行您希望它在此处执行的操作。

答案 1 :(得分:1)

我认为您希望计数具有唯一值

for(i in 1:(length(unique(v)-1)))
 {
    res[i] =  length(v[v==unique(v)[i]]) / length(v[v >unique(v)[i]])
 }
  res
[1] 0.1538462 0.1818182 0.1000000 0.4285714 6.0000000       Inf
  res = c(2/13, 2/11, 1/10, 3/7, 6/1, 10/0) 
> res
[1] 0.1538462 0.1818182 0.1000000 0.4285714 6.0000000       Inf

答案 2 :(得分:0)

使用colSums的另一种方法:

tmp <- unique(v)
colSums(sapply(tmp, "==", v)) / colSums(sapply(tmp, "<", v))
# [1] 0.1538462 0.1818182 0.1000000 0.4285714 6.0000000       Inf