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))