incrementando le prestazioni della pipeline del sito Web sostituendo i loop con le istruzioni vettoriali perturbare l'output

2

Sono inesperto con l'iterazione in R e spero di velocizzare un processo mentre sto implementando alcune analisi in un sito web. Mi rendo conto che questa potrebbe essere una Q per SO, ma non ho potuto ottenere una risposta da loro ...

Ho trovato un tutorial molto utile che mi permette di scorrere attraverso una matrice, selezionare i dati dei criteri sopra una certa soglia (> 0,01) e quindi permeare tre vettori: "source, target and corr" con questi valori alla fine creare un frame di dati ben organizzato.

adjacency<-adjacency(dat)
m<-adjacency
source=c()
target=c()
corr<-c()
g1<-rownames(adjacency)[1:dim(m)[1]]
g2<-g1
for(gene in g1){
  for(gen in g2){
    if(m[gene,gen]>0.001){
      source<-c(source,gene)
      target<-c(target,gen)
      corr<-c(corr,m[gene,gen])
    }
  }
}
network<-data.frame(source,target,corr)

Tuttavia per i big data frames questo codice è piuttosto lento e sono passato al formato vettoriale. Eppure quando lo provo in formato vettoriale, il suo output è diverso ...

network2 = which(m > 0.001, arr.ind = TRUE)
source = network2[,1]
target  = network2[,2]
corr = m[m > 0.001]
network2<-cbind(network2, corr)
colnames(network2)<-c("source", "target", "corr")

Il mio problema è che quando eseguo queste due parti di codice sullo stesso vettore

>network
   source target        corr
1      n1     n1 1.000000000
2      n1     n3 0.001466542
3      n1     n7 0.001164927
4      n1     n9 0.004027818
5      n2     n2 1.000000000
6      n2     n9 0.002580978

Quanto sopra è l'output atteso dal codice loop for:

Tuttavia per i big data frames questo codice è piuttosto lento e sono passato al formato vettoriale. Eppure quando lo provo in formato vettoriale, il suo output è diverso ...

network2 = which(m > 0.001)
source = network2[,1]
target  = network2[,2]
corr = m[m > 0.001]
network2<-cbind(network2, corr)
colnames(network2)<-c("source", "target", "corr")

Il problema è che ottengo il seguente errore:

matching_indices = which(m > 0.01)
source = matching_indices[,1]

Error in matching_indices[, 1] : incorrect number of dimensions

Questo perché non ho usato l'argomento 'are.ind = TRUE' nel comando 'match'. Ma specificare questo dà un risultato indesiderato (poiché richiede solo i nodi che interagiscono con se stessi) ... quindi mi chiedo cosa dovrei fare a riguardo?

L'output indesiderato è il seguente (notare che 'corr' è all'unanimità 1, prendendo in considerazione solo i nodi auto-replicanti):

> network2
    source target corr
n1       1      1    1
n2       2      2    1
n3       3      3    1
n4       4      4    1
n5       5      5    1
n6       6      6    1

Come faccio a ottenere l'output del codice in formato vettoriale per essere uguale al tipo per ciclo?

dati di esempio possono essere memorizzati nella variabile "dat" con il seguente codice:

library('dplyr')
library('igraph')
library('RColorBrewer')

set.seed(1)

# generate a couple clusters
nodes_per_cluster <- 30
n <- 10

nvals <- nodes_per_cluster * n

# cluster 1 (increasing) 
cluster1 <- matrix(rep((1:n)/4, nodes_per_cluster) + 
                   rnorm(nvals, sd=1),
                   nrow=nodes_per_cluster, byrow=TRUE)

# cluster 2 (decreasing)
cluster2 <- matrix(rep((n:1)/4, nodes_per_cluster) + 
                   rnorm(nvals, sd=1),
                   nrow=nodes_per_cluster, byrow=TRUE)

# noise cluster
noise <- matrix(sample(1:2, nvals, replace=TRUE) +
                rnorm(nvals, sd=1.5),
                nrow=nodes_per_cluster, byrow=TRUE)

dat <- rbind(cluster1, cluster2, noise)
colnames(dat) <- paste0('n', 1:n)
rownames(dat) <- c(paste0('cluster1_', 1:nodes_per_cluster), 
                   paste0('cluster2_', 1:nodes_per_cluster),
                   paste0('noise_',    1:nodes_per_cluster))
    
posta Chris 20.07.2016 - 14:50
fonte

1 risposta

0

Non ho trovato adjacency , quindi userò una matrice campione:

set.seed(1)
m <- matrix(runif(100), nr=10)
network2 <- which(m < 0.1, arr.ind = TRUE)

Penso che questo possa essere il punto cruciale della tua differenza:

corr <- m[network2]
cbind(network2, corr)
#      row col       corr
# [1,]  10   1 0.06178627
# [2,]   7   3 0.01339033
# [3,]   7   5 0.02333120
# [4,]   5   6 0.07067905
# [5,]   6   6 0.09946616
# [6,]   9   7 0.08424691
# [7,]   2  10 0.05893438

Puoi rinominare e ristrutturare ciò che ti serve.

    
risposta data 21.10.2016 - 17:21
fonte

Leggi altre domande sui tag