2012-03-30 18 views
9

Estoy tratando un circuito como este, donde quiero asignar el nombre de la columna de la matriz de forma dinámica:nombre de la columna dinámica en bucle con cbind

for(i in 1:nclass){ 
    P <- eXb/SeXb[mydata$chid] 
    mydata <- cbind(mydata, paste("l_", i, sep="")=P) 
} 

Cualquier idea (aparte de cambiar COLNAMES a posteriori)?

Gracias

+2

Estoy de acuerdo con romana, el establecimiento de los COLNAMES todos a la vez es mejor. Si parece frustrante que lo que intentas sea difícil, ten en cuenta que R no "quiere" ser usado de esta manera, es decir, el viraje de las columnas de a una por vez. Es una sugerencia sutil para repensar su estrategia general. – joran

+0

Apostaría por la mayoría de los problemas de R, el nombramiento de las columnas se hace después de facto. Para recalcar el punto de joran de casa, eche un vistazo a las mejoras de velocidad disponibles cuando preasigne previamente sus objetos y los rellene visualmente con cada iteración: http://stackoverflow.com/search?q=[r ] + preasignar – Chase

+0

gracias joran: la preasignación de memoria es la forma correcta de hacerlo. – danfreak

Respuesta

12

¿Qué tal esto? Debería establecer los nombres de las columnas una vez que haya terminado su matriz completamente resuelta.

> a <- matrix(1:9, 3) 
> a 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 5 8 
[3,] 3 6 9 
> colnames(a) <- paste("col", 1:3, sep = "") 
> a 
    col1 col2 col3 
[1,] 1 4 7 
[2,] 2 5 8 
[3,] 3 6 9 
0

Si entiendo bien su pregunta ...

a <- as.data.frame(matrix(1:9, ncol=3)) 
n <- ncol(a) 
b <- as.data.frame(matrix(10:18, ncol=3)) 
colnames(b) <- c("col2", "col1", "col3") 
attach(b) 

for (i in 1:ncol(b)) { 
    n <- n+1 
    d <- get(paste("col", i, sep="")) 
    a <- cbind(a, d) 
    colnames(a)[n] <- paste("col", i, sep="") 
} 

print(a) 
+0

Gracias attitude_stool, este es el camino, incluso si como he entendido, la mejor manera en R para aumentar el rendimiento es crear primero una columna vacía (preasignación de memoria) del tamaño deseado, y luego asignar los valores – danfreak

0
#here I am extracting the generes of movies and assigning to a dataframe 
for(i in 1:length(imdb_generes)){ # imdb_generes c("action","friction","scifi") 
    genr <- imdb_generes[i] 
    a <- somefunction(-----,genr) # somefunction returns c(1,1,0),c(0,1,0),(1,0,0) subsequently 
    names(a) <- genr 
    my_df <- cbind(my_df,a) 
} 

my_df 
action friction scifi 
    1  0  1 
    1  1  0 
    0  0  0 
2

Si no se fijan en el uso de cbind, también se puede hacer esto:

for(i in 1:nclass){ 
    P <- eXb/SeXb[mydata$chid] 
    mydata[,paste0("l_",i)] <- P 
} 

Paste0 es simplemente pegar con sep = "" que es realmente útil. Afortunadamente, paste y paste0 se pueden usar para crear nuevas columnas sin cbind como se muestra arriba.

3

Si usted tiene el problema de que no se sabe el número de la columna adicional, puede añadir y nombrarlos por:

df <- data.frame(matrix(1:9, 3, 3)) 
df 
#> X1 X2 X3 
#>1 1 4 7 
#>2 2 5 8 
#>3 3 6 9 

for(i in 1:5){ 
    df[, ncol(df) + 1] <- rnorm(nrow(df)) 
    names(df)[ncol(df)] <- paste0("mean_", i) 
} 

df 
#> X1 X2 X3  mean_1  mean_2 mean_3  mean_4  mean_5 
#>1 1 4 7 -1.9983501 -1.6810377 1.2893602 0.5342042 -0.8354363 
#>2 2 5 8 0.5966507 -0.5628999 1.2953387 -0.6661931 -0.4685747 
#>3 3 6 9 -0.4268952 -2.0069306 0.6390317 -0.3505088 0.1230753 
Cuestiones relacionadas