我想弄清楚为什么rbind
函数不符合预期的时候加入data.frames没有名称。 这里是我的测试:rbind data.frames without names
test <- data.frame(
id=rep(c("a","b"),each=3),
time=rep(1:3,2),
black=1:6,
white=1:6,
stringsAsFactors=FALSE
)
# take some subsets with different names
pt1 <- test[,c(1,2,3)]
pt2 <- test[,c(1,2,4)]
# method 1 - rename to same names - works
names(pt2) <- names(pt1)
rbind(pt1,pt2)
# method 2 - works - even with duplicate names
names(pt1) <- letters[c(1,1,1)]
names(pt2) <- letters[c(1,1,1)]
rbind(pt1,pt2)
# method 3 - works - with a vector of NA's as names
names(pt1) <- rep(NA,ncol(pt1))
names(pt2) <- rep(NA,ncol(pt2))
rbind(pt1,pt2)
# method 4 - but... does not work without names at all?
pt1 <- unname(pt1)
pt2 <- unname(pt2)
rbind(pt1,pt2)
这对我来说似乎有点奇怪。我错过了一个很好的理由,为什么这不应该开箱即用?
编辑,了解更多信息
使用@ JoshO'Brien的建议,debug
,我可以识别错误的rbind.data.frame
功能
if (is.null(pi) || is.na(jj <- pi[[j]]))
(网络版的这一if
声明部分中发生代码在这里:http://svn.r-project.org/R/trunk/src/library/base/R/dataframe.R开始于:“###这里是rbind和cbind的方法”)
从单步执行程序开始,pi
的值似乎并未设置在此位置,因此程序会尝试索引内置常量pi
,如pi[[3]]
和错误输出。
从我自己看着办,内部pi
对象不会出现设置由于这种早期行,其中clabs
已被初始化为NULL
:
if (is.null(clabs)) clabs <- names(xi) else { #pi gets set here
我在纠结试图弄清楚这但是会在更新时一起更新。
查看'rbind.data.frame'的代码**其中大多数**涉及检查和匹配列名和行名。您可以执行'debug(rbind.data.frame)',然后逐步执行方法4以确定错误发生的位置。 –
@ JoshO'Brien - 已更新以提供更多信息。我在解释代码方面并不擅长,并且正在努力,但也许这对其他人来说是显而易见的。 – thelatemail