我正在尝试创建一个包含两列和未知行数的空数据框。我想指定列的名称。我运行了以下命令
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"
答案 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))