2012-11-28 72 views
6

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

我在糾結試圖弄清楚這但是會在更新時一起更新。

+3

查看'rbind.data.frame'的代碼**其中大多數**涉及檢查和匹配列名和行名。您可以執行'debug(rbind.data.frame)',然後逐步執行方法4以確定錯誤發生的位置。 –

+0

@ JoshO'Brien - 已更新以提供更多信息。我在解釋代碼方面並不擅長,並且正在努力,但也許這對其他人來說是顯而易見的。 – thelatemail

回答

5

因爲unname() &顯式指定NA作爲列標題不是相同的操作。當列名全部是NA時,則可以使用rbind()。由於rbind()採用數據幀的名稱/姓名,因此結果不匹配&,因此rbind()失敗。

下面是一些代碼,以幫助明白我的意思:

> c1 <- c(1,2,3) 
> c2 <- c('A','B','C') 
> df1 <- data.frame(c1,c2) 
> df1 
    c1 c2 
1 1 A 
2 2 B 
3 3 C 
> df2 <- data.frame(c1,c2) # df1 & df2 are identical 
> 
> #Let's perform unname on one data frame & 
> #replacement with NA on the other 
> 
> unname(df1) 
    NA NA 
1 1 A 
2 2 B 
3 3 C 
> tem1 <- names(unname(df1)) 
> tem1 
NULL 
> 
> #Please note above that the column headers though showing as NA are null 
> 
> names(df2) <- rep(NA,ncol(df2)) 
> df2 
    NA NA 
1 1 A 
2 2 B 
3 3 C 
> tem2 <- names(df2) 
> tem2 
[1] NA NA 
> 
> #Though unname(df1) & df2 look identical, they aren't 
> #Also note difference in tem1 & tem2 
> 
> identical(unname(df1),df2) 
[1] FALSE 
> 

我希望這有助於。每個名稱都顯示爲NA,但這兩個操作是不同的。 因此,將其列標題替換爲NA的2個數據幀可以是「rbound」,但是沒有任何列標題的2個數據幀(使用unname()實現)不能。

+2

這是很好的信息,我有+ 1ed。雖然我可以看到'NA'和'unname' data.frames有不同的'names()',但我仍然認爲如果r能夠處理'names()''''''''''這些都是「NA」。 – thelatemail