Подтвердить что ты не робот

Как добавить строки в пустые кадры данных с заголовком в R?

Возможный дубликат:
R: потеря имени столбца при добавлении строк в пустой кадр данных

Я создал пустой фреймворк с именами столбцов только следующим образом

> compData <- data.frame(A= numeric(0), B= numeric(0))
> compData
[1] A B
<0 rows> (or 0-length row.names)
> compData <- rbind(compData,c(5,443))
> compData
  X5 X443
1  5  443

в приведенном выше примере после добавления одной строки имена столбцов изменены. Как добавить новые данные строки в кадр данных?

4b9b3361

Ответ 1

Добавление в нуль-строку data.frame будет действовать по-разному с добавлением к data.frame, который уже содержит строки

От ?rbind

Метод фрейма данных rbind сначала отбрасывает все аргументы нулевого столбца и нулевой строки. (Если это не осталось, он возвращает первый аргумент с столбцами, иначе кадр данных нулевой строки с нулевым столбцом.) Затем он берет классы столбцов из первого фрейма данных и сопоставляет столбцы по имени (а не по положению), Факторы увеличивают свои уровни по мере необходимости (в порядке уровней уровней уровней встречающихся факторов), а результат является упорядоченным фактором тогда и только тогда, когда все компоненты являются упорядоченными факторами. (Последняя точка отличается от S-PLUS.) Старые категории (целые векторы с уровнями) продвигаются к факторам.

У вас есть несколько вариантов -

самый простой

 compData[1, ] <- c(5, 443)

более сложный

Или вы можете принудить c(5,433) к списку или data.frame

rbind(compData,setNames(as.list(c(5,443)), names(compData)))

или

rbind(compData,do.call(data.frame,setNames(as.list(c(5,443)), names(compData))))

Но в этом случае вы также можете сделать

do.call(data.frame,setNames(as.list(c(5,443)), names(compData)))

опция data.table

Вы можете использовать функцию data.table rbindlist, которая делает меньше проверки и, таким образом, сохраняет имена первого data.frame

library(data.table)
rbindlist(list(compData, as.list(c(5,443))

Ответ 2

Я просто получил более простой способ сделать это... следующим образом

compData <- data.frame(A= numeric(0), B= numeric(0))
compData
compData[nrow(compData)+1, ] <- c(5, 443)
compData

Ответ 3

Colnames <- names(compData)
compData <- rbind(compData, c(5, 443))
names(compData) <- Colnames

Ответ 4

Вы можете назначить фрейм данных по индексу:

compData <- data.frame(A= numeric(0), B= numeric(0))
compData
compData[1, ] <- c(5, 443)
compData

Что дает:

> compData <- data.frame(A= numeric(0), B= numeric(0))
> compData
[1] A B
<0 rows> (or 0-length row.names)
> compData[1, ] <- c(5, 443)
> compData
  A   B
1 5 443

Ответ 5

Если у вас есть данные того же типа *, вы можете сделать следующее:

  • Преобразование реального кадра данных в матрицу.
    as.matrix(compData)
  • Добавьте новую строку в конец.
    rbind(as.matrix(compData), c(5,443))
  • Преобразуйте матрицу обратно в фрейм данных.
    as.data.frame(rbind(as.matrix(compData), c(5,443)))

Короче:
compData <- as.data.frame(rbind(as.matrix(compData), c(5,443)))

* Если у вас есть данные того же типа, вы можете сохранить их в матрице.

Ответ 6

Вы можете использовать функцию structure с аргументом .Names:

compData <- structure(rbind(compData,c(5,443)), .Names = names(compData))

#  A   B
#1 5 443