2010-05-04 64 views
13

Tôi đang cố gắng để thay thế các yếu tố của một data.frame có chứa "# N/A" với "NULL", và tôi chạy vào vấn đề:R: Làm thế nào để thay thế các phần tử của một data.frame?

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 

indices_of_NAs <- which(foo == "#N/A") 

replace(foo, indices_of_NAs, "NULL") 

Lỗi trong [<-.data.frame (*tmp*, danh sách, giá trị = "NULL"): các cột mới sẽ để lại lỗ sau các cột hiện có

Tôi nghĩ rằng vấn đề là chỉ mục của tôi đang xử lý data.frame dưới dạng vectơ, nhưng hàm thay thế đang xử lý nó theo cách khác nhau, nhưng Tôi không chắc vấn đề là gì?

Trả lời

19

NULL thực sự có nghĩa là "không có gì", không "thiếu" vì vậy nó không thể thay thế giá trị thực tế - vì thiếu R sử dụng NA.

Bạn có thể sử dụng phương pháp thay thế là.na để cập nhật trực tiếp các phần tử đã chọn, điều này sẽ hoạt động với kết quả logic. (Việc sử dụng cho chỉ mục sẽ chỉ hoạt động với is.na, sử dụng trực tiếp [invokes list access, đây là nguyên nhân gây ra lỗi của bạn).

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 
NAs <- foo == "#N/A" 

## by replace method 
is.na(foo)[NAs] <- TRUE 

## or directly 
foo[NAs] <- NA 

Nhưng, bạn đã đối phó với chuỗi (trên thực tế là một yếu tố theo mặc định) trong cột od của bạn bằng cách ép buộc buộc khi nó được tạo ra với c(), và bạn có thể cần phải điều trị cột riêng. Bất kỳ cột số nào sẽ không bao giờ khớp với chuỗi "# N/A", ví dụ.

+0

Không bao giờ nhận ra rằng có một "is.na <-", quá tuyệt. – geoffjentry

+0

Bạn có ý nghĩa gì bởi "Bất kỳ cột số nào sẽ không bao giờ khớp với chuỗi" # N/A ", chẳng hạn."? Làm thế nào tôi có thể kiểm tra loại cột tôi đang xem? – spier

+0

Giải pháp tốt. Làm thế nào để bạn làm cho các cột được diễn giải lại dưới dạng số sau khi thay thế các giá trị bằng NA? Tôi đã có hàng chục cột và quá khó để biết những cái nào có giá trị NA đã được thay đổi. – Dave

1

Hàm thay thế dự kiến ​​một vectơ và bạn đang cung cấp một data.frame.

Bạn thực sự nên cố gắng sử dụng NANULL thay vì giá trị ký tự mà bạn hiện đang sử dụng. Nếu không, bạn sẽ không thể tận dụng tất cả các chức năng của R để xử lý các giá trị bị thiếu.

Sửa

Bạn có thể sử dụng một chức năng áp dụng, hoặc làm điều gì đó như thế này:

foo <- data.frame(day= c(1, 3, 5, 7), od = c(0.1, NA, 0.4, 0.8)) 
idx <- which(is.na(foo), arr.ind=TRUE) 
foo[idx[1], idx[2]] <- "NULL" 

Bạn không thể gán một giá trị thực NULL trong trường hợp này, bởi vì nó có chiều dài bằng không. Điều quan trọng là phải hiểu sự khác biệt giữa NANULL, vì vậy tôi khuyên bạn nên đọc ?NA?NULL.

+0

Cảm ơn Shane, bạn có khuyên tôi chuyển đổi dữ liệu của tôi.frame thành véc tơ, thực hiện chức năng và sau đó chuyển đổi dữ liệu trở lại data.frame? Tôi sẽ sử dụng các định dạng dữ liệu bạn đề xuất. – John

12

Tại sao không

x$col[is.na(x$col)]<-value 

?
Bạn sẽ không phải thay đổi khung dữ liệu của mình

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