2010-04-28 7 views
3

J'ai une liste appelée cols avec les noms de colonnes en elle:Spécification des noms de colonnes dans une liste dans la commande data.frame

cols <- c('Column1','Column2','Column3')

J'aimerais reproduire cette commande, mais avec un appel à la liste:

data.frame(Column1=rnorm(10))

Voici ce qui se passe quand je l'essaye:

> data.frame(cols[1]=rnorm(10))

Error: unexpected '=' in "data.frame(I(cols[1])="

La même chose se produit si je conclurai cols[1] dans I() ou eval().

Comment puis-je envoyer cet élément à partir du vecteur dans la commande data.frame()?

Mise à jour:

Pour des renseignements généraux, j'ai défini une fonction calc.means() qui prend une trame de données et une liste de variables et effectue une opération de ddply vaste et complexe, résumant au niveau indiqué par les variables.

Ce que je suis en train de faire avec la commande data.frame() est de marcher en arrière les niveaux d'agrégation au sommet, réexécuter calc.means() à chaque étape et en utilisant rbind() pour coller les résultats sur l'autre. J'ai besoin d'ajouter des colonnes factices avec des valeurs 'All' pour que le rbind fonctionne correctement.

Je roule cast fonctionnalités de marge comme dans ddply, fondamentalement, et je ne voudrais pas retaper les noms de colonnes pour chaque exécution. Voici le code complet:

cols <- c('Col1','Col2','Col3') 
rbind (calc.means(dat,cols), 
    data.frame(cols[1]='All', calc.means(dat, cols[2:3])), 
    data.frame(cols[1]='All', cols[2]='All', calc.means(dat, cols[3])) 
) 

Répondre

1

Je ne sais pas comment le faire directement, mais vous pouvez simplement sauter l'étape de l'attribution des noms dans la commande data.frame(). En supposant que vous stocker le résultat de data.frame() dans une foo variable nommée, vous pouvez simplement faire:

noms (foo) < - Col.

après la trame de données est créé

+0

Oui, cela fonctionnerait normalement, mais 'data.frame()' se passe dans un 'rbind()'. Merci quand même. –

+1

Vous pouvez créer le bloc de données, affecter les noms de colonnes, puis les lier, le tout dans une seule clause. – Shane

+0

Shane, Comment cela fonctionnerait-il? Je ne suis pas sûr comment passer les objets à travers le processus dans une seule clause. –

2

Utilisation peut utiliser structure:

cols <- c("a","b") 

foo <- structure(list(c(1, 2), c(3, 3)), .Names = cols, row.names = c(NA, -2L), class = "data.frame") 

Je ne comprends pas pourquoi vous faites cela bien!

1

Il y a une astuce. Vous pourriez jouer avec des listes:

cols_dummy <- setNames(rep(list("All"), 3), cols) 

Ensuite, si vous utilisez l'appel à la liste avec un paren alors vous devriez obtenir ce que vous voulez

data.frame(cols_dummy[1], calc.means(dat, cols[2:3])) 

Vous pouvez l'utiliser sur la volée comme setNames(list("All"), cols[1]) mais je pense que c'est moins élégant.

Exemple:

some_names <- list(name_A="Dummy 1", name_B="Dummy 2") # equivalent of cols_dummy from above 
data.frame(var1=rnorm(3), some_names[1]) 
#  var1 name_A 
# 1 -1.940169 Dummy 1 
# 2 -0.787107 Dummy 1 
# 3 -0.235160 Dummy 1 
0

Je crois que la fonction assign() est votre réponse:

cols <- c('Col1','Col2','Col3') 
data.frame(assign(cols[1], rnorm(10))) 

Retours:

assign.cols.1...rnorm.10.. 
1     -0.02056822 
2     -0.03675639 
3     1.06249599 
4     0.41763399 
5     0.38873118 
6     1.01779018 
7     1.01379963 
8     1.86119518 
9     0.35760039 
10     1.14742560 

Avec le lapply() ou sapply() , vous devriez être capable de boucler le processus cbind(). Quelque chose comme:

operation <- sapply(cols, function(x) data.frame(assign(x, rnorm(10)))) 
final  <- data.frame(lapply(operation, cbind)) 

Retours:

Col1.assign.x..rnorm.10.. Col2.assign.x..rnorm.10.. Col3.assign.x..rnorm.10.. 
1    0.001962187    -0.3561499    -0.22783816 
2    -0.706804781    -0.4452781    -1.09950505 
3    -0.604417525    -0.8425018    -0.73287079 
4    -1.287038060     0.2545236    -1.18795684 
5    0.232084366    -1.0831463    0.40799046 
6    -0.148594144     0.4963714    -1.34938144 
7    0.442054119     0.2856748    0.05933736 
8    0.984615916    -0.0795147    -1.91165189 
9    1.222310749    -0.1743313    0.18256877 
10    -0.231885977    -0.2273724    -0.43247570 

Ensuite, pour nettoyer les noms de colonnes:

colnames(final) <- cols 

Retours:

  Col1  Col2  Col3 
1 0.19473248 0.2864232 0.93115072 
2 -1.08473526 -1.5653469 0.09967827 
3 -1.90968422 -0.9678024 -1.02167873 
4 -1.11962371 0.4549290 0.76692067 
5 -2.13776949 3.0360777 -1.48515698 
6 0.64240694 1.3441656 0.47676056 
7 -0.53590163 1.2696336 -1.19845723 
8 0.09158526 -1.0966833 0.91856639 
9 -0.05018762 1.0472368 0.15475583 
10 0.27152070 -0.2148181 -1.00551111 

Cheers,

Adam

Questions connexes