web-dev-qa-db-fra.com

R: insérer un vecteur sous forme de ligne dans data.frame

Puis-je insérer un vector comme ligne dans un data.frame? Si c'est le cas, comment?

27
aks

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
14
Roman Luštrik

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

6
Eric Leschinski

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.

2
exteralvictor