我正在尝试创建一个包含两列和未知行数的空数据框 . 我想指定列的名称 . 我运行了以下命令
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:
我解决这个问题的懒惰解决方案是在for循环之后运行follwing命令,将数据绑定到我的data.frame
names(dat)[1] = "id"
names(dat)[2] = "nobs"
4 回答
您应该尝试在rbind()中指定列名:
dat = rbind(dat, data.frame("id" = i, "nobs" = nobs))
有趣的是,
rbind.data.frame
函数抛弃了所有传递的零行数值 . 它基本上发生在这一行因此,传入没有行的data.frame,实际上就像没有传递任何东西一样 . 另一个很好的例子,为什么尝试逐行构建data.frame几乎总是一个坏主意 . 更好地构建向量,然后只在完成后才组合成一个data.frame .
这样可以保留列名称
我会改变你将数据附加到数据框的方式 . 由于rbind似乎删除了列名,只需替换索引位置即可 .
仅供参考,默认数据框创建会将所有字符串转换为因子,而不是此处的问题,因为所有数据格式都是数字格式 . 但是如果你有一个character(),你可能想要关闭默认的stringsAsFactors = FALSE,以附加字符列表 .