我想弄清楚爲什麼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