2012-09-18 17 views
10

Ho provato alcune soluzioni proposte qui. Ma non stava funzionando per il mio caso. Ho un codice, qui:Imposta diagonale di una matrice a zero in R

a <- read.table("Whirr_127.csv", header=T, sep=",", row.names=1) # task assignment/people vs task 
b <- read.table("Files_Whirr_127.csv", header=T, sep=",", row.names=1) #task vs files 
a 
b 

#calc cr , cr = ta * tf * transpose(ta) 
cr <- as.matrix(a) %*% (as.matrix(b) %*% as.matrix(t(b)) %*% as.matrix(t(a))) 
cr 

#set value to 1, to initialize table 
cr[cr>=1]<-1 
cr 

#identify diagonal matrix, set to zero 
cr<-as.matrix(0,ncol=ncol(cr),nrow=nrow(cr)) 
cr<-diag(cr,x=0) 

voglio impostare il valore diagonale come zero. Sembra che il codice utilizzato nelle ultime due righe non funzioni per il mio caso.

Inoltre, vorrei utilizzare il nome del file in a, e salvato come AB_Files_Whirr_127.csv Ho cercato di usare

write.csv(cr,file = paste("CR_", a,".csv") 

ma, nulla appare nella mia directory.

output di esempio per cr:

   Adrian Cole Alison Wong Andrei Savu Bruno Dumon Edward J. Yoon Eugene Koontz Jakob Homan Kelvin Kakugawa Kirk True Lars George Soren Macbeth Stu Hood 
Adrian Cole    0   0   0   0    0    0   0    0   0   0    0  0 
Alison Wong    0   0   0   0    0    0   0    0   0   0    0  0 
Andrei Savu    0   0   1   0    0    0   0    0   0   1    1  0 
Bruno Dumon    0   0   0   0    0    0   0    0   0   0    0  0 
Edward J. Yoon   0   0   0   0    0    0   0    0   0   0    0  0 
Eugene Koontz    0   0   0   0    0    0   0    0   0   0    0  0 
Jakob Homan    0   0   0   0    0    0   0    0   0   0    0  0 
Kelvin Kakugawa   0   0   0   0    0    0   0    0   0   0    0  0 
Kirk True     0   0   0   0    0    0   0    0   0   0    0  0 
Lars George    0   0   1   0    0    0   0    0   0   1    1  0 
Soren Macbeth    0   0   1   0    0    0   0    0   0   1    1  0 
Stu Hood     0   0   0   0    0    0   0    0   0   0    0  0 
Tibor Kiss    0   0   0   0    0    0   0    0   0   0    0  0 
Tom White     0   0   1   0    0    0   0    0   0   1    1  0 
Unassigned    0   0   0   0    0    0   0    0   0   0    0  0 
       Tibor Kiss Tom White Unassigned 
Adrian Cole    0   0   0 
Alison Wong    0   0   0 
Andrei Savu    0   1   0 
Bruno Dumon    0   0   0 
Edward J. Yoon   0   0   0 
Eugene Koontz   0   0   0 
Jakob Homan    0   0   0 
Kelvin Kakugawa   0   0   0 
Kirk True    0   0   0 
Lars George    0   1   0 
Soren Macbeth   0   1   0 
Stu Hood     0   0   0 
Tibor Kiss    0   0   0 
Tom White    0   1   0 
Unassigned    0   0   0 

risposta

10

a non possono essere utilizzati nel nome del file di output in quanto non è una variabile carattere, è un frame di dati.

infile <- "Whirr_127.csv" 
a <- read.table(infile, header=T, sep=",", row.names=1) 
.... 
diag(cr) <- 0 
write.csv(cr, file = paste0("CR_", infile, ".csv") 

La sintassi della linea diag tende a guardare divertente a nuovi utenti R, ma è in realtà solo una sintassi alternativa per richiamare la funzione di assegnazione diag<-, cioè diag(x) <- 0 viene interpretato come diag<-(x, 0).

Aggiornamento: più file

Se si vuole ripetere quanto sopra per più accoppiato file si può fare questo.

a.files <- grep("^Whirr", dir(), value=TRUE) 
b.files <- paste0("Files_", a.files) 
for(i in length(a.files)){ 
    a <- read.table(a.files[i], ...) 
    b <- read.table(b.files[i], ...) 
    ... 
    write.csv(cr, paste0("CR_", a.files[i], ".csv")) 
} 
+0

ringraziamento, il lavoro soluzione di diagonale per me, ma il file non viene visualizzata in Risorse directory di lavoro ... – user1676484

+0

ho modificato il post, allo stesso tempo lo si legge, probabilmente. La soluzione con 'paste0 (" CR_ ", infile," .csv ")' dovrebbe funzionare decisamente. Se non si è sicuri che il comando 'paste0' restituisca un carattere scalare. – Backlin

+0

è solo una soluzione semplice per diag. sciocco me! comunque, diciamo, ho più file, questo significa che devo sostituire infile (file = paste0 ("CR_", infile, ".csv") con filepath? È corretto? – user1676484

Problemi correlati