Jakub Gruszczyński

Jakub Gruszczyński badania, analizy,
insighty

Temat: Sumowanie niektórych elementów wektora

Witam, zwracam się do Was z następującą sprawą,
nie potrafię sobie poradzić z pewnym problemem - mianowicie w jaki sposób sumować niektóre elementy wektora, już tłumaczę o co chodzi:

mam wektor vec=c(1,1,1,0,0,0,1,1,0,0,1,0)

w wyniku chciałbym otrzymać "długości sąsiadujących elementów o ile są takie same"

czyli (3,0,2,0,1,0) lub nawet (3,2,1)

Innymi słowy należy zsumować sąsiadujące i identyczne elementy.

Jakby były potrzebne dodatkowe wyjaśnienia to służę. Dodam tylko, że mam do obróbki dość duże dane, więc jeśli dałoby się uniknąć używania pętli to byłoby super.Jakub Gruszczyński edytował(a) ten post dnia 14.07.08 o godzinie 14:32
Jerzy Dmitrowicz

Jerzy Dmitrowicz Konsultant IT /
Project Manager

Temat: Sumowanie niektórych elementów wektora

Może funkcja rle() jest tym czego szukasz...
Jakub Gruszczyński

Jakub Gruszczyński badania, analizy,
insighty

Temat: Sumowanie niektórych elementów wektora

Super! Bardzo mi ona pomogła. Wystarczyło użyć

rle(vect)$len[-which(rle(vect)$val==0)]

i dało oczekiwany wynik (czyli długości ciągów jedynek).

Pozdrawiam i jeszcze raz dziękuję.

Może kogoś to zainteresuje:
Okazało się (o dziwo), że moja funkcja:

#funkcja grupujaca jedynki
agg=function(vect)
{
vec=as.integer(vect);
z=c();
i=2;

while (i<=length(vec))
{
s=0;
while((vec[i]==0)&&(i<=length(vec)))
{
s=s+1;
i=i+1;
}
if (s!=0) (z=c(z,s));
i=i+1;
}
z;
}

której efekt działania jest taki sam jak z użyciem gle, działa 2,5 raza szybciej. Do tej pory byłem przekonany, że użycie funkcji wbudowanych w R, przyśpiesza działanie programu - okazuje się, że nie :).

PozdrawiamJakub Gruszczyński edytował(a) ten post dnia 15.07.08 o godzinie 09:05
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: Sumowanie niektórych elementów wektora

hmmm, ciekawe, ale wydaje mi się, że jest odwrotnie...

Po pierwsze, 'rle' zlicza wszystkie sekwencje a nie tylko ciągi jedynek tak jak twoja funkcja.

Po drugie, na mojej machinie:

x <- sample(0:1, 10000, replace=TRUE)
system.time(rle(x))
# user system elapsed
# 0.01 0.00 0.02
system.time(agg(x))
# user system elapsed
# 0.12 0.00 0.13

a więc 'rle' jest 12 razy szybsze niż 'agg'. Może oceniałeś szybkość w inny sposób?

m.
Jakub Gruszczyński

Jakub Gruszczyński badania, analizy,
insighty

Temat: Sumowanie niektórych elementów wektora

W ten sam sposób. Tylko ponieważ potrzebowałem zliczenia tylko i wyłącznie jedynek porównywałem czas mojej funkcji agg z czymś takim:

rle(vect)$len[-which(rle(vect)$val==0)]

Ponadto (może to miało jakiś wpływ) pracowałem na rzeczywistych danych. Była to macierz 0-1 o rozmiarze c.a. 400 x 2000.

Pozdrawiam

Następna dyskusja:

Wczytywanie danych z pliku ...




Wyślij zaproszenie do