2012-09-18 7 views
10

He intentado algunas soluciones propuestas aquí. Pero no estaba funcionando para mi caso. Tengo un código, aquí:Establecer diagonal de una matriz a cero en 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) 

quiero fijar el valor en diagonal como cero. Parece que el código utilizado en las últimas dos líneas no funciona para mi caso.

Además, me gustaría usado el nombre del archivo en a y guardado como AB_Files_Whirr_127.csv He intentado utilizar

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

pero, nada aparece en mi directorio.

ejemplo de salida para 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 

Respuesta

10

a no se pueden utilizar en el nombre del archivo de salida, ya que no es una variable de carácter, se trata de una trama de datos.

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 sintaxis de la línea diag tiende a parecer gracioso para los nuevos usuarios de I, pero en realidad es sólo una sintaxis alternativa para llamar a la función de asignación de diag<-, es decir diag(x) <- 0 se interpreta como diag<-(x, 0).

Actualización: Múltiples archivos

Si desea repetir lo anterior para múltiples emparejado archivos que usted puede hacer esto.

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

gracias, el trabajo en diagonal solución para mí, pero el archivo no se parece en mi directorio de trabajo ... – user1676484

+0

edité el cargo, al mismo tiempo que lo lea probablemente. La solución con 'paste0 (" CR_ ", infile," .csv ")' debería funcionar definitivamente. Si no, asegúrese de que el comando 'paste0' devuelve un carácter escalar. – Backlin

+0

es solo una solución simple para diag. ¡tonto de mí! de todos modos, digamos, tengo archivos múltiples, eso quiere decir que tengo que reemplazar el archivo infile (file = paste0 ("CR_", infile, ".csv") con filepath? ¿Es correcto? – user1676484

Cuestiones relacionadas