2015-05-07 17 views
6

Jestem nowy dla R, to może być głupie pytanie, ale nie wiem jak rozwiązać.jak przechowywać wynik na liście z pętli for?

Mam pętlę for, która zwróci prawdopodobnie niepuste elementy i * j.

Chcę zapisać wszystkie niepuste wyniki w liście, ale jeśli używam result[[i]]<-tmp w pętli, można przechowywać tylko do i elementów, w jaki sposób mogę przechowywać wszystkie wartości na liście? Dzięki

result<-list() 
    for (i in 1:nrow(m)){ 
    for (j in 1:i){ 
     if(m[i,j]!=0 && m[j,i]!=0){ 
     num=min(m[i,j],m[j,i]) 
     tmp=c(i,j,num) 
     result[[i]]<-tmp 
     } 
    } 
    } 

sample data 
set.seed(123) 
m= matrix(sample(0:5, size = 5*5, replace = TRUE), ncol = 5) 

Pożądany odpowiedź

row col min 
[1] 1 1 1 
[1] 2 2 3 
[1] 3 1 2 
[1] 3 2 2 
[1] 3 3 4 
[1] 4 1 5 
[1] 4 2 1 
[1] 4 4 1 
[1] 5 1 5 
[1] 5 2 2 
[1] 5 4 5 
[1] 5 5 3 

Per Dawida

pmin(mx[upper.tri(mx, diag = TRUE)], mx[lower.tri(mx, diag = TRUE)]) 

[1] 1 0 2 5 2 3 5 1 0 1 3 0 1 5 3 

powraca

 > result 
[[1]] 
[1] 1 1 2 

[[2]] 
[1] 2 2 3 

[[3]] 
[1] 3 3 4 

[[4]] 
[1] 4 4 2 

[[5]] 
[1] 5 5 4 
+2

pętle i rośnie w listach R są bardzo powolne. Czy możesz ponownie przemyśleć swój algorytm jako funkcję zastosowaną do każdego elementu macierzy i użyć 'apply()'? –

+1

Czy w zasadzie nie obliczasz 'pmin (m, t (m))'? –

+1

Nie jestem pewien, co próbujesz zrobić i co dokładnie nie działa. Nie potrzebujesz tak dużego zestawu danych, aby odtworzyć problem. Myślę, że coś takiego jak 'm = matrix (sample.int (5, size = 5 * 5, replace = TRUE), ncol = 5)' powinno zrobić. Użyj również 'set.seed' i pokaż, czego oczekujesz od pętli' for'. –

Odpowiedz

3

Oto coś jak na @ DavidArenburg odpowiedzi (przeliczona z komentarzem):

idx <- which(upper.tri(m,diag=TRUE),arr.ind=TRUE) 
v <- pmin(m[idx], m[idx[,2:1]]) 

cbind(idx,min=v)[v>0,] 

co daje

 row col min 
[1,] 1 1 1 
[2,] 2 2 3 
[3,] 1 3 2 
[4,] 2 3 2 
[5,] 3 3 4 
[6,] 1 4 5 
[7,] 2 4 1 
[8,] 4 4 1 
[9,] 1 5 5 
[10,] 2 5 2 
[11,] 4 5 5 
[12,] 5 5 3 
+1

To bardzo miłe. Właśnie napisałem podobną odpowiedź, ale to miłe użycie słowa "co" jest znacznie lepsze. Idę z 'tm <- t (m); pmin (tm [upper.tri (tm, diag = TRUE)], m [upper.tri (m, diag = TRUE)]) ' –

Powiązane problemy