Puis-je insérer un vector
comme ligne dans un data.frame
? Si c'est le cas, comment?
Je ne dirais pas que c'est la solution la plus élégante et la plus jolie qui existe, mais elle fait le travail. Notez que chaque ligne de trame de données porte son propre nom de ligne, ce qui devient un problème lors de l'insertion de nouvelles lignes. Cela étant dit, vous pouvez réparer cela 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
Créer une trame de données R à partir du vecteur, horizontalement
L'idée clé est d'utiliser la méthode de transposition R: t(...)
pour transposer le vecteur avant de le passer à data.frame
constructeur.
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;
Tirages:
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 de quelques centaines de lignes, attendez-vous à attendre longtemps. Si vous devez ê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 très délicat cependant pour gérer le numéro de ligne exact avant et après. Un moyen plus rapide consiste à utiliser insertRow
dans le package miscTools
.
Dans l'exemple d'ensemble de données ci-dessus, 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
L'espoir serait utile.