2010-09-06 10 views

Répondre

11

Je ne prétends pas que ce soit la solution la plus élégante et la plus jolie qui existe, mais cela fait l'affaire. Notez que chaque ligne de données porte son propre nom de ligne, ce qui pose un problème lors de l'insertion de nouvelles lignes. Cela étant dit, vous pouvez le réparer avec row.names (voir ci-dessous).

my.df <- data.frame(a = runif(10), b = runif(10), c = runif(10)) 
my.vec <- c(1, 1, 1) 
new.df <- rbind(my.df[1:5, ], my.vec, my.df[6:nrow(my.df), ]) 
new.df 
      a   b   c 
1 0.45433791 0.3798105 0.84514864 
2 0.07074529 0.4985765 0.53912585 
3 0.09645574 0.5441647 0.96636213 
4 0.60788436 0.6070706 0.53791603 
5 0.01593911 0.1697248 0.62697924 
6 1.00000000 1.0000000 1.00000000 
61 0.98455694 0.2206702 0.85500531 
7 0.85356834 0.5279596 0.27462326 
8 0.48028935 0.6689572 0.05428349 
9 0.95675901 0.6875491 0.77642924 
10 0.24691330 0.7980741 0.24013096 

row.names(new.df) <- 1:nrow(new.df) # make row names pretty again 
+0

Vous pouvez faire les noms de lignes dans 'rbind' avec l'argument' make.row.names = FALSE' –

1

Faire une R dataframe de vecteur, horizontalement

L'idée clé est d'utiliser la méthode de transposition R: t(...) pour transposer le vecteur avant de passer au constructeur data.frame.

my_name_vector  = c("penguin1", "penguin2", "penguin3", "penguin4"); 
my_data_vector  = c("Skipper", "Kowalski", "Rico",  "Private"); 
supplemental_vector = c("Mumble", "Dorthy", "Norma", "Memphis"); 

#create a data frame out of a transposed vector 
penguins = as.data.frame(t(my_data_vector)); 
#change the names of the dataframe to be the titles 
colnames(penguins) <- my_name_vector; 

supplemental_data_frame <- data.frame(t(supplemental_vector)); 
colnames(supplemental_data_frame) <- my_name_vector; 
supplemental_data_frame; 

#rbind means row bind, pass in two data.frame 
penguins <- rbind(penguins, supplemental_data_frame); 
penguins; 

Prints:

penguin1 penguin2 penguin3 penguin4 
1 Mumble Dorthy Norma Memphis 

    penguin1 penguin2 penguin3 penguin4 
1 Skipper Kowalski Rico  Private 
2 Mumble Dorthy Norma Memphis 

La méthode rbind est très inefficace, donc si vous faites cela plus que quelques centaines de lignes, attendez-vous à attendre longtemps. Si vous avez besoin d'être rapide comme l'éclair, vous devez pré-allouer de l'espace ou utiliser la méthode de liste comme indiqué ici: https://stackoverflow.com/a/20689857/445131

1

rbind est bon, mais vraiment difficile de gérer le numéro de ligne exact avant et après. Un moyen plus rapide est d'utiliser insertRow dans le paquet miscTools.

Dans l'exemple ci-dessus jeu de données, le code serait:

my.df <- as.matrix(data.frame(a = runif(10), b = runif(10), c = runif(10))) 
my.vec <- c(1, 1, 1) 
new.df <- insertRow(my.df,7,my.vec) 
new.df 

espoir serait utile.

+0

C'est BEAUCOUP PLUS BEAU que rbind! Je vous remercie! – Rodrigo