2012-03-30 32 views
9

sto cercando un ciclo come questo, dove voglio assegnare il nome della colonna della matrice in modo dinamico:nome di colonna dinamica nel ciclo for con cbind

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

Qualsiasi idea (a parte cambiare colnames ex-post)?

Grazie

+2

Sono d'accordo con Roman, impostando i colnames tutto in una volta è meglio. Se sembra frustrante che ciò che stai provando sia difficile, tieni a mente che R non "vuole" essere usato in questo modo, vale a dire la virata delle colonne una alla volta come questa. È un suggerimento sottile per ripensare alla tua strategia generale. – joran

+0

Scommetto che per la maggior parte dei problemi R, la denominazione delle colonne è fatta a posteriori. Per dare un martello al punto di casa joran, dai un'occhiata ai miglioramenti di velocità disponibili quando prelezzi i tuoi oggetti prima mano e li compili di fronte a farli crescere con ogni iterazione: http://stackoverflow.com/search?q=[r ] + preallocate – Chase

+0

grazie joran: la preallocazione della memoria è il modo corretto per farlo! – danfreak

risposta

12

Che dire di questo? Dovresti impostare i nomi delle colonne dopo aver completato la tua matrice perfettamente elaborata.

> 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

Se ho capito bene la tua domanda ...

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

Grazie a attitude_stool, questo è il modo, anche se come ho capito il modo migliore in R per aumentare le prestazioni è quello di creare prima una colonna vuota (preallocazione della memoria) della dimensione desiderata, e quindi di assegnare i valori – 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

Se non si imposta sull'uso cbind, si può anche fare questo:

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

Paste0 è solo incollare con sep = "" che è davvero utile. Fortunatamente, paste e paste0 possono essere utilizzati per creare nuove colonne senza cbind come mostrato sopra.

3

Se avete il problema che non si conosce il numero della colonna aggiunta, è possibile aggiungere e assegnare loro un nome da:

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