Puis-je insérer un vector
en tant que ligne dans un data.frame
? Si c'est le cas, comment?R: Insérer un vecteur comme une ligne dans data.frame
Répondre
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
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
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.
C'est BEAUCOUP PLUS BEAU que rbind! Je vous remercie! – Rodrigo
Vous pouvez faire les noms de lignes dans 'rbind' avec l'argument' make.row.names = FALSE' –