Проблема с объектом rbind для фрейма данных в r - PullRequest
1 голос
/ 25 июня 2019

Я создал таблицу:

RpgCharDF <- data.frame(Name = character(),
                        Level = integer(),
                        ClassChar = character(),
                        Race = character(),
                        HP = integer(),
                        Attack = integer(),
                        Resist = integer())

Написал функцию-конструктор:

RPGcharacter <- function(name, level, rpgClass, race, HP, attack, resist){
    value <- list(name= name, level = level, rpgClass = rpgClass, HP = HP, attack = attack, resist = resist)
    attr(value, "class") <- "RPGcharacter"
    value
}

Создал два объекта с помощью функции:

Artur <- RPGcharacter("Artur", 22, "Warlock", "Dwarf", 130, 12, 3)
Dawid <- RPGcharacter("Dawid", 1, "Homeless", "Gnome", 20, 2, 1)

И до сих пор,все работает отлично.Я получил в окружении правильный DF и два объекта в виде списка с 6 значениями.

Теперь я попытался добавить объекты в DF:

RpgCharDF <- rbind(RpgCharDF, Dawid)
RpgCharDF <- rbind(RpgCharDF, Artur)

И я получил ошибку:

Warning in `[<-.factor`(`*tmp*`, ri, value = "Artur") :
  invalid factor level, NA generated
Warning in `[<-.factor`(`*tmp*`, ri, value = "Warlock") :
  invalid factor level, NA generated

Это предупреждение, поэтому объект был добавлен в DF, но этовыглядит так:

    NAME  Level RPGClass   HP  ATTACK  RESIST
1   Dawid   1   Homeless    20    2      1
2   NA      22  NA         130   12      3

В DF есть значения NA.

Где я допустил ошибку?Что не так с этим кодом?Я должен заметить, что оба элемента Артур и Давид созданы нормально.Оба имеют заполненное имя и т. Д., Когда я нажимаю в окружении.

Ответы [ 2 ]

3 голосов
/ 25 июня 2019

Когда вы звоните rbind, он преобразует вывод в data.frame. Поскольку вы не указываете, как строки должны быть обработаны, они преобразуются в фактор и, таким образом, при попытке добавить вторую строку дает NA для имени столбца символа и атаки.

Вы можете использовать:

RpgCharDF <- rbind(RpgCharDF, Dawid, stringsAsFactors = FALSE)
RpgCharDF <- rbind(RpgCharDF, Artur, stringsAsFactors = FALSE)

или:

RpgCharDF <- do.call(rbind, list(RpgCharDF, Dawid, Artur))

Дополнительное примечание:

Построение строки data.frame строка за строкой, вероятно, очень медленно в R, поэтому rbindlist, рекомендованный @HarshalGajare, работает быстрее. Смотрите также обсуждение здесь:
rbind не дает ожидаемый результат в r
и здесь:
R: невозможно привязать более одного наблюдения к фрейму данных

1 голос
/ 25 июня 2019

Используйте rbindlist вместо rbind:

RpgCharDF <- data.frame(Name = character(),
                        Level = integer(),
                        rpgClass = character(),
                        Race = character(),
                        HP = integer(),
                        Attack = integer(),
                        Resist = integer())

RPGcharacter <- function(Name, Level, rpgClass, Race, HP, Attack, Resist){
  value <- list(Name= Name, Level = Level, rpgClass = rpgClass,Race=Race, HP = HP, Attack = Attack, Resist = Resist)
  attr(value, "class") <- "RPGcharacter"
  value
}

library(data.table)

Artur <- RPGcharacter("Artur", 22, "Warlock", "Dwarf", 130, 12, 3)
Dawid <- RPGcharacter("Dawid", 1, "Homeless", "Gnome", 20, 2, 1)

RpgCharDF <- rbindlist(list(RpgCharDF, Dawid, Artur), fill = T, use.names = T)
RpgCharDF

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...