2014-02-04 2 views
1

У меня есть вектор v, такие какФункция для нахождения особого отношения в R

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, который дает результат желания?

ответ

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

Я думаю, что вы хотите граф с уникальным значением

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 
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 
Смежные вопросы