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.
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. –
@ 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