我有一个向量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中编写一个能产生所需结果的函数?
答案 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