使用列名创建空data.frame

时间:2014-07-22 22:43:57

标签: r dataframe

我正在尝试创建一个包含两列和未知行数的空数据框。我想指定列的名称。我运行了以下命令

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

任何人都可以告诉为什么数据框中的列名称会发生​​变化

修改

我解决这个问题的懒惰解决方案是在for循环之后运行以下命令,将数据绑定到我的data.frame

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

4 个答案:

答案 0 :(得分:10)

有趣的是,rbind.data.frame函数抛弃了所有传递的零行数。它基本上发生在这一行

allargs <- allargs[nr > 0L]

所以传入一个没有行的data.frame,真的好像根本没有传递它。另一个很好的例子,为什么尝试逐行构建data.frame几乎总是一个坏主意。更好地构建向量,然后仅在完成时组合成data.frame。

答案 1 :(得分:2)

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

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

这会保留列名

答案 2 :(得分:0)

我会更改您将数据附加到数据框的方式。由于rbind似乎删除了列名,只需替换索引位置即可。

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

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

 } 

仅供参考,默认数据框创建会将所有字符串转换为因子,而不是此处的问题,因为所有数据格式都是数字格式。但是如果你有一个character(),你可能想要关闭默认的stringsAsFactors = FALSE,以附加字符列表。

答案 3 :(得分:0)

您应该尝试在rbind()中指定列名:

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