Вставка строки в data.frame в R

Я уже ссылался на этот вопрос Вставить строку в data.table , я получаю эту ошибку:

Warning message:
In `[<-.factor`(`*tmp*`, ri, value = "All") :
  invalid factor level, NA generated

Когда я пытаюсь вставить новую строку, содержащую только значение "All", вот так:

d <- copy(as.data.frame(Orange))
d <- rbind(d, c("All", "All", "All"))

Он выдает предупреждение и вставляет "All" в последние 2 столбца и вставляет NA в первый столбец.

Что я здесь делаю неправильно, я знаю, что это должно быть очень просто.


person Bear    schedule 31.07.2018    source источник


Ответы (3)


Согласно этому аргументы rbind должны быть либо фреймом данных, либо объектом, который можно принудительно включить во фрейм данных. Он не может принудительно ввести c("All","All","All") во фрейм данных. Вместо этого я бы просто создал новый фрейм данных: d <- rbind(d, data.frame(...)). У вас также могут быть некоторые несоответствия типов данных.

person zambonee    schedule 31.07.2018
comment
Код d <- rbind(d, data.frame("All", "All", "All")) приводит к Error in match.names(clabs, names(xi)) : names do not match previous names. Я думаю, что он пытается взять это и превратить Alls в один столбец вместо 1 All на столбец из существующего data.frame. - person Bear; 31.07.2018
comment
Попробуйте указать эти имена столбцов фрейма данных, например. rbind(d, data.frame(some.column="All",some.other.column="All",last.column="All")). - person zambonee; 31.07.2018

Это единственный способ заставить это работать без ошибок. Я предполагаю, что есть лучший способ сделать это, хотя.

d <- copy(as.data.frame(Orange))
add <- data.frame("All", "All", "All")
names(add) <- names(d)
d <- rbind(d, add)
person Bear    schedule 31.07.2018

Попробуйте изменить c("all", "all", "all") на list("all", "all", "all"). Векторы (созданные c()) создают столбцы в фреймах данных. Вы можете либо сделать список, либо сделать то, что вы пытаетесь rbind data.frame (поскольку data.frames - это просто специальные списки).

person jntrcs    schedule 31.07.2018