2017-02-08 14 views
11

Tôi chỉ phát hiện các hành vi sau đây của is.na() chức năng mà tôi không hiểu:Tại sao is.na() thay đổi đối số của nó?

df <- data.frame(a = 5:1, b = "text") 
df 
## a b 
## 1 5 text 
## 2 4 text 
## 3 3 text 
## 4 2 text 
## 5 1 text 
is.na(df) 
##   a  b 
## [1,] FALSE FALSE 
## [2,] FALSE FALSE 
## [3,] FALSE FALSE 
## [4,] FALSE FALSE 
## [5,] FALSE FALSE 
is.na(df) <- "0" 
df 
## a b 0 
## 1 5 text NA 
## 2 4 text NA 
## 3 3 text NA 
## 4 2 text NA 
## 5 1 text NA 

Câu hỏi của tôi
Tại sao is.na() thay đổi đối số của nó (và trong trường hợp này cho biết thêm một cột bổ sung cho các dữ liệu khung)? Trong trường hợp này, hành vi của nó có vẻ khó hiểu hơn (hoặc ít nhất là bất ngờ) vì kết quả của truy vấn là FALSE cho tất cả các trường hợp.

NB
Câu hỏi này không phải là về Subsetting và thay đổi NA giá trị trong một khung dữ liệu - Tôi biết làm thế nào để làm điều đó (df[is.na(df)] <- "0"). Câu hỏi này là về hành vi của hàm is.na! Tại sao việc gán cho hàm is.something thay đổi chính đối số - điều này là bất ngờ.

+0

Bạn cần phải sử dụng các biến hợp lý đó làm tham chiếu chỉ mục, nghĩa là 'df [is.na (df)] <- 0' – Sotos

+0

@Sotos: Vui lòng xem nhận xét của tôi. – vonjd

+0

@ vonjd Tôi thấy nhận xét của bạn, nhưng quan điểm của tôi là nhiệm vụ của bạn không hoạt động ngay cả khi có các giá trị NA, tức là 'df $ a [3] <- NA; is.na (df) <- "0" ' – akrun

Trả lời

14

Chức năng thực tế đang được sử dụng ở đây không phải là is.na() nhưng chức năng gán `is.na<-`, phương pháp mặc định là `is.na<-.default`. In chức năng đó vào bảng điều khiển mà chúng tôi thấy:

function (x, value) 
{ 
    x[value] <- NA 
    x 
} 

Vì vậy, rõ ràng, value được coi là chỉ mục tại đây. Nếu bạn lập chỉ mục một số data.frame như df["0"], nó sẽ cố gắng chọn cột có tên "0". Nếu bạn chỉ định thứ gì đó cho số df["0"], cột sẽ được tạo và điền (trong trường hợp này) NA.

Để làm rõ, `is.na<-` bộ giá trị cho NA, nó không thay NA giá trị với cái gì khác.

+0

Cảm ơn bạn, vì vậy điểm tôi bỏ lỡ là trong trường hợp này một phép gán cho 'is.na' thực sự * đặt * các giá trị thành' NA'. Tôi sẽ có * không bao giờ * nghĩ điều này có thể. – vonjd

+2

Đó là tài liệu nhưng có lẽ một chút ngạc nhiên, vâng. – Axeman

+0

Đó chính xác là cách mà các tên gọi() và colnames() hoạt động, giống như các ví dụ khác. Cả hai đều nhận được và thiết lập. Nó thực sự là cú pháp rất nhất quán. – Elin

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