2017-06-14 9 views
7

mam matrycy tak:Scal kolumn opartych na wartości o indeksie w odrębnym wektorze

> y 
    [,1] [,2] [,3] [,4] 
[1,] 17 14 5 8 
[2,] 7 2 17 2 
[3,] 10 18 6 6 
[4,] 6 11 4 11 
[5,] 5 9 4 9 

i wektor

> group 
[1] 1 2 2 3 

Wektor grupy wskazuje, że kolumna 1, w grupie 1 kolumny 2 i 3 znajdują się w grupie 2, a kolumna 3 w grupie 3. Chcę połączyć kolumny w y (przez dodanie), tak aby wszystkie kolumny przypisane do konkretnej grupy zostały dodane razem, tj. tak, aby uzyskać:

 [,1] [,2] [,3] 
[1,] 17 19 8 
[2,] 7 19 2 
[3,] 10 24 6 
[4,] 6 15 11 
[5,] 5 13 9 

Doznałem z podziałem, scalaniem i redukcją, ale naprawdę nie dostaję się nigdzie.

Odpowiedz

5

Możemy zrobić

sapply(split(seq_along(group), group), function(x) rowSums(y[, x, drop = FALSE])) 
#  1 2 3 
#[1,] 17 19 8 
#[2,] 7 19 2 
#[3,] 10 24 6 
#[4,] 6 15 11 
#[5,] 5 13 9 

Albo inna opcja jest rowsum

t(rowsum(t(y), group)) 
#  1 2 3 
#[1,] 17 19 8 
#[2,] 7 19 2 
#[3,] 10 24 6 
#[4,] 6 15 11 
#[5,] 5 13 9 
+1

Dokładnie to, czego potrzebowałem, i +1 dla podstawowego rozwiązania R, które było dla mnie użyteczne. – smiley

1

Oto dplyr sposób:

data.frame(group = group, t(y)) %>% 
    group_by(group) %>% 
    summarise_each(funs(sum), -group) %>% 
    ungroup() %>% 
    select(-group) %>% 
    as.matrix() %>% 
    t() 

podziale, my transpozycji y i ustaw go jako data.frame na group jako oddzielną kolumnę. Następnie możemy pobrać każdą kolumnę z grupy o wartości &. Ostatnie cztery kroki dotyczą przekształcenia wyniku z powrotem w pożądany format.

Powiązane problemy