R: вставить вектор в виде строки в data.frame

Могу ли я вставить vector как строку в data.frame? Если да, то как?


person aks    schedule 06.09.2010    source источник


Ответы (3)


Я бы не стал утверждать, что это самое элегантное и красивое решение, но оно выполняет свою работу. Обратите внимание, что каждая строка кадра данных имеет свое собственное имя строки, что становится проблемой при вставке новых строк. При этом вы можете исправить это с помощью row.names (см. ниже).

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
person Roman Luštrik    schedule 06.09.2010
comment
Вы можете указать имена строк в rbind с аргументом make.row.names=FALSE - person Rich Scriven; 05.03.2017

Создать кадр данных R из вектора по горизонтали

Ключевым моментом является использование метода транспонирования R: t(...) для транспонирования вектора перед его передачей конструктору 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;

Отпечатки:

   penguin1 penguin2 penguin3 penguin4
1  Mumble   Dorthy   Norma    Memphis

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

Метод rbind очень неэффективен, поэтому, если вы делаете это более чем с несколькими сотнями строк, ждите долго. Если вам нужно быть молниеносным, вам нужно предварительно выделить пространство или использовать метод списка, как показано здесь: https://stackoverflow.com/a/20689857/445131

person Eric Leschinski    schedule 05.03.2017

rbind хорош, но действительно сложен, поскольку обрабатывает точный номер строки до и после. Более быстрый способ — использовать insertRow в пакете miscTools.

В приведенном выше примере набора данных код будет таким:

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

Надежда будет полезна.

person exteral    schedule 25.11.2017
comment
Это НАМНОГО ЛУЧШЕ, чем rbind! Спасибо! - person Rodrigo; 03.03.2018
comment
Еще один хороший способ — использовать bind_rows из пакета dplyr. dplyr.tidyverse.org/reference/bind.html - person peixe; 25.10.2019