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

Создайте пустой файл data.frame с именами столбцов

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

dat <- data.frame("id"=numeric(),"nobs"=numeric())  

Я могу проверить результат, запустив

> str(dat)
'data.frame':   0 obs. of  2 variables:
 $ id  : num 
 $ nobs: num   

Но позже, когда я вставляю данные в этот фрейм данных, используя rbind в следующей команде, имена столбцов также изменяются

  for (i in id) {
    nobs = nrow(na.omit(read.csv(files_list[i])))
    dat = rbind(dat, c(i,nobs))
  } 

После цикла for это значение dat

dat
  X3 X243
1  3  243

И команда str показывает следующие

str(dat)

'data.frame':   1 obs. of  2 variables:
 $ X3  : num 3
 $ X243: num 243

Может ли кто-нибудь сказать, почему имена столбцов в изменении фрейма данных

EDIT:

Мое ленивое решение для решения проблемы заключается в том, чтобы запускать команды follwing после цикла, который привязывает данные к моему data.frame

names(dat)[1] = "id"
names(dat)[2] = "nobs"
4b9b3361

Ответ 1

Интересно, что функция rbind.data.frame выбрасывает все переданные значения с нулевыми строками. Это в основном происходит в этой строке

allargs <- allargs[nr > 0L]

поэтому передача в data.frame без строк, на самом деле похожа на то, что она вообще не передает его. Еще один хороший пример, почему почти всегда плохая идея пытаться построить data.frame по строкам. Лучше создавать векторы, а затем объединять в data.frame только тогда, когда это делается.

Ответ 2

dat = data.frame(col1=numeric(), col2=numeric())  

...loop
    dat[, dim(dat)[1] + 1] = c(324, 234) 

Сохраняет имена столбцов

Ответ 3

Я бы изменил, как вы добавляете данные в фрейм данных. Поскольку rbind, кажется, удаляет имена столбцов, просто замените индексированное местоположение.

dat <- data.frame("id"=numeric(),"nobs"=numeric())  

for (i in id) {
   dat[i,] <- nrow(na.omit(read.csv(files_list[i])))

 } 

FYI, создание фреймов по умолчанию преобразует все строки в факторы, а не проблему, поскольку все ваши форматы данных являются числовыми. Но если у вас есть символ(), вы можете отключить строки по умолчаниюAsFactors = FALSE, чтобы добавить списки символов.

Ответ 4

Попробуйте указать имена столбцов внутри rbind():

dat = rbind(dat, data.frame("id" = i, "nobs" = nobs))