Чтобы сохранить классы определенных переменных, вы должны сделать две вещи:
1) Установите stringsAsFactors = FALSE, чтобы символьная переменная не стала фактором.
2) Новая строка должна быть списком.
Как в этом примере:
> df.empty <- data.frame(column1 = numeric(), column2 = character(),
+ column3 = factor(levels=c("A","B","C")), stringsAsFactors = FALSE)
>
> newRow <- list(-2, "MyString","B")
> incorrectRow <- list(-2, "MyString", "C")
>
> # Not mess columns names
>
> df.empty[nrow(df.empty) + 1,] <- newRow
> df.empty[nrow(df.empty) + 1,] <- incorrectRow
>
> df.empty
column1 column2 column3
1 -2 MyString B
2 -2 MyString C
> summary(df.empty)
column1 column2 column3
Min. :-2 Length:2 A:0
1st Qu.:-2 Class :character B:1
Median :-2 Mode :character C:1
Mean :-2
3rd Qu.:-2
Max. :-2
Для сохранения имен столбцов, кредит идет на этот ответ:
https://stackoverflow.com/a/15718454/8382633
Моя первая попытка была также с rbind, но у нее есть некоторые недостатки. Он не сохраняет имена столбцов, а также конвертирует все строки в факторы, или, если вы установите stringsAsFactors = FALSE, все факторы в строки !!
> df.empty <- rbind.data.frame(df.empty, newRow, incorrectRow)
>
> summary(df.empty)
c..2...2. c..MyString....MyString.. c..B....C..
Min. :-2 MyString:2 B:1
1st Qu.:-2 C:1
Median :-2
Mean :-2
3rd Qu.:-2
Max. :-2
> class(df.empty$c..MyString....MyString..)
[1] "factor"
или со строкамиAsFactors = FALSE:
> df.empty <- rbind.data.frame(df.empty, newRow, incorrectRow, stringsAsFactors = FALSE)
>
> summary(df.empty)
c..2...2. c..MyString....MyString.. c..B....C..
Min. :-2 Length:2 Length:2
1st Qu.:-2 Class :character Class :character
Median :-2 Mode :character Mode :character
Mean :-2
3rd Qu.:-2
Max. :-2
>
> class(df.empty$c..B....C..)
[1] "character"
Я думал, что это было близко к дубликату. Но, в конце концов, эти вопросы открыли мне больше вопросов.
Надеюсь, это поможет.