2014-10-31 21 views
9

Tôi đã tìm kiếm rộng rãi nhưng không tìm thấy câu trả lời cho câu hỏi này trên Stack Overflow.Thêm Cột vào khung dữ liệu trống trong R

Cho phép nói rằng tôi có khung dữ liệu a.

tôi xác định:

a <- NULL 
a <- as.data.frame(a) 

Nếu tôi muốn thêm một cột vào khung dữ liệu này như vậy:

a$col1 <- c(1,2,3) 

tôi nhận được lỗi sau:

Error in `$<-.data.frame`(`*tmp*`, "a", value = c(1, 2, 3)) : 
    replacement has 3 rows, data has 0 

Tại sao kích thước hàng cố định nhưng cột không?

Làm cách nào để thay đổi số hàng trong một khung dữ liệu?

Nếu tôi làm điều này (nhập dữ liệu vào một danh sách đầu tiên và sau đó chuyển sang một df), nó hoạt động tốt:

a <- NULL 
a$col1 <- c(1,2,3) 
a <- as.data.frame(a) 

Trả lời

7

Kích thước hàng chưa được khắc phục, nhưng data.frames được lưu trữ dạng danh sách các vectơ bị hạn chế để có cùng độ dài. Bạn không thể thêm col1 vào acol1 có ba giá trị (hàng) và a không có, do đó phá vỡ ràng buộc. R không theo mặc định tự động sửa đổi các giá trị khi bạn cố gắng mở rộng kích thước của một data.frame bằng cách thêm một cột dài hơn data.frame. Lý do mà ví dụ thứ hai hoạt động là col1 là vector duy nhất trong data.frame để data.frame được khởi tạo với ba hàng.

Nếu bạn muốn tự động có data.frame mở rộng, bạn có thể sử dụng chức năng sau:

cbind.all <- function (...) 
{ 
    nm <- list(...) 
    nm <- lapply(nm, as.matrix) 
    n <- max(sapply(nm, nrow)) 
    do.call(cbind, lapply(nm, function(x) rbind(x, matrix(, n - 
     nrow(x), ncol(x))))) 
} 

này sẽ điền giá trị thiếu với NA. Và bạn sẽ sử dụng nó như: cbind.all(df, a)

+0

Tôi đoán điều này gần với những gì tôi đã làm. Tôi nghĩ rằng có một giải pháp thông minh hơn thế này. Tôi nhận ra rằng tôi đã sử dụng một vector như trái ngược với việc thêm nó vào một khung dữ liệu. Ngoài ra, tôi có lẽ đã không mô tả những gì tôi có ý nghĩa tốt khi tôi sử dụng từ cố định. Không thể thay đổi thứ nguyên hàng dễ dàng như thứ nguyên cột. – Michal

+0

Ngoài ra, câu trả lời giống như sau: http://stackoverflow.com/questions/7962267/cbind-a-df-with-an-empty-df-cbind-fill – Michal

1

Bạn cũng có thể làm điều gì đó như thế này nơi tôi đọc trong dữ liệu từ nhiều tệp, lấy cột tôi muốn và lưu trữ trong khung dữ liệu. Tôi kiểm tra xem liệu khung dữ liệu có bất kỳ thứ gì trong đó hay không, tạo một tài liệu mới thay vì nhận được lỗi về số hàng không khớp:

readCounts = data.frame() 

for(f in names(files)){ 
    d = read.table(files[f], header=T, as.is=T) 
    d2 = round(data.frame(d$NumReads)) 
    colnames(d2) = f 
    if(ncol(readCounts) == 0){ 
     readCounts = d2 
     rownames(readCounts) = d$Name 
    } else{ 
     readCounts = cbind(readCounts, d2) 
    } 
} 
Các vấn đề liên quan