2012-11-28 21 views
6

Tôi đang cố gắng tìm ra lý do tại sao hàm rbind không hoạt động như dự định khi tham gia dữ liệu.frames không có tên. Đây là thử nghiệm của tôi:rbind data.frames không có tên

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) 

Điều này có vẻ hơi lạ với tôi. Tôi đang thiếu một lý do chính đáng tại sao điều này không nên làm việc ra khỏi hộp?

chỉnh sửa để biết thêm

Sử dụng @ đề nghị JoshO'Brien để debug, tôi có thể xác định các lỗi như xảy ra trong thời gian này phần if tuyên bố của rbind.data.frame chức năng

if (is.null(pi) || is.na(jj <- pi[[j]])) 

(phiên bản trực tuyến của mã ở đây: http://svn.r-project.org/R/trunk/src/library/base/R/dataframe.R bắt đầu từ: "### Dưới đây là các phương pháp cho rbind và cbind.")

Từ bước thông qua chương trình, giá trị pi dường như không được đặt tại thời điểm này, do đó chương trình sẽ cố gắng lập chỉ mục hằng số được tích hợp pi như pi[[3]] và lỗi.

Từ những gì tôi có thể hình dung, đối tượng nội pi không xuất hiện để được thiết lập do dòng này sớm hơn nơi clabs đã được khởi tạo như NULL:

if (is.null(clabs)) clabs <- names(xi) else { #pi gets set here 

Tôi đang ở một mớ cố gắng tìm này nhưng sẽ cập nhật khi nó kết hợp với nhau.

+3

Xem qua mã của 'rbind.data.frame' ** nhất ** trong số đó có liên quan đến việc kiểm tra và đối sánh tên cột và hàng. Bạn có thể làm 'debug (rbind.data.frame)' và sau đó bước qua phương pháp của bạn 4 để xác định chính xác nơi lỗi được ném. –

+0

@ JoshO'Brien - đã cập nhật để cung cấp thêm một số thông tin. Tôi không giỏi giải thích mã và đang làm việc ở đó, nhưng có lẽ nó sẽ hiển nhiên với người khác. – thelatemail

Trả lời

5

unname() & chỉ định rõ ràng NA làm tiêu đề cột không phải là hành động giống nhau. Khi các tên cột đều là NA, thì có thể rbind(). Vì rbind() lấy tên/tên của khung dữ liệu, kết quả không khớp với & do đó rbind() không thành công.

Dưới đây là một số mã để giúp nhìn thấy những gì tôi có nghĩa là:

> 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 
> 

Tôi hy vọng điều này sẽ giúp. Tên hiển thị dưới dạng NA, nhưng hai hoạt động khác nhau. Do đó, 2 khung dữ liệu có tiêu đề cột thay thế cho NA có thể là "rbound" nhưng 2 khung dữ liệu không có bất kỳ tiêu đề cột nào (không thể sử dụng unname()).

+2

Đây là thông tin tốt và tôi đã +1. Trong khi tôi có thể thấy rằng 'NA' và' unname' data.frames có 'names()' khác nhau, tôi vẫn nghĩ R có thể 'rbind' unnamed' data.frames' nếu nó có thể xử lý 'names()' tất cả đều là 'NA'. – thelatemail

Các vấn đề liên quan