我试图弄清楚为什么rbind
在加入没有名称的 data.frames 时该功能无法按预期工作。这是我的测试:
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
,我可以将错误识别为在函数的此if
语句部分期间发生rbind.data.frame
if (is.null(pi) || is.na(jj <- pi[[j]]))
(这里的代码在线版本:http ://svn.r-project.org/R/trunk/src/library/base/R/dataframe.R开始于:“ ### 这里是 rbind 和 cbind 的方法。 ")
从单步执行程序来看,此时pi
似乎没有设置 的值,因此程序尝试索引内置常量pi
likepi[[3]]
并出错。
据我所知,内部pi
对象似乎没有设置,因为前面的行clabs
已被初始化为NULL
:
if (is.null(clabs)) clabs <- names(xi) else { #pi gets set here
我很纠结,试图弄清楚这一点,但会随着它的组合而更新。