2015-06-30 16 views
7

Trong ví dụ rất đơn giản sau đây, tôi không thể hiểu hành vi của toán tử "==".Giải thích về hành vi của toán tử "=="

A <- c(10, 20, 10, 10, 20, 30) 
B <- c(40, 50, 60, 70, 80, 90) 

df <- data.frame(A, B) 

df[df$A == c(10,20), ]  # it returns 3 lines instead of 5 
df[df$A %in% c(10,20), ] # it works properly and returns 5 lines 

Cảm ơn bạn trước tất cả các bạn.

+0

Rất giống với: [Lý do cho đầu ra không mong muốn trong khung dữ liệu subsetting] (http://stackoverflow.com/questions/23145736/reason-for-unexpected-output-in-subsetting-data-frame-r/23145840) – thelatemail

Trả lời

10

Để hiểu điều gì đang xảy ra, bạn phải hiểu cấu trúc khung dữ liệu và quy tắc tái chế. Khung dữ liệu chỉ đơn giản là một danh sách các vectơ.

> unclass(df) 
$A 
[1] 10 20 10 10 20 30 

$B 
[1] 50 60 50 40 70 80 

attr(,"row.names") 
[1] 1 2 3 4 5 6 

Nếu bạn so sánh hai vectơ có độ dài khác nhau trong R thì ngắn hơn là recycled. Trong trường hợp của bạn df$A == c(10,20) tương đương với:

> c(10, 20, 10, 10, 20, 30) == c(10, 20, 10, 20, 10, 20) 
[1] TRUE TRUE TRUE FALSE FALSE FALSE 

> df[c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE), ] 
    A B 
1 10 50 
2 20 60 
3 10 50 

Từ %in% documentation:

%in% trả về một vector logic cho thấy nếu có một trận đấu hay không cho trái của nó operand

> df$A %in% c(10,20) 
[1] TRUE TRUE TRUE TRUE TRUE FALSE 

> df[c(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE), ] 
    A B 
1 10 50 
2 20 60 
3 10 50 
4 10 40 
5 20 70 
+0

Tôi không biết điều này về tái chế. Cảm ơn bạn 032. – Apostolos

3

Đây là giải pháp của tôi mà tôi hy vọng thêm một số hiểu biết để khác câu trả lời (rất tốt). Như đã nêu trong "Nghệ thuật lập trình R" bởi Norman Matloff:

Khi áp dụng phẫu thuật để hai vectơ mà đòi hỏi họ phải có cùng chiều dài , R tự động tái chế, hoặc lặp đi lặp lại, ngắn hơn một, cho đến khi nó đủ dài để khớp với hình ảnh dài hơn

nếu khái niệm vẫn chưa rõ ràng. Hãy xem này và cố gắng đoán kết quả:

c(10, 10, 10, 10, 10, 10) == c(10, 20) 

mà sẽ cung cấp:

[1] TRUE FALSE TRUE FALSE TRUE FALSE 

vì nó tái chế vector "ngắn" và bằng cách làm như vậy nó sẽ so sánh 10 đầu tiên bên phải đầu tiên bên trái (và đó là TRUE) nhưng so sánh mười thứ hai với 20 (phần tử thứ hai của vectơ ở bên phải) và đó là FALSE; sau đó R tái chế vectơ ngắn hơn (là phần bên phải) và trò chơi bắt đầu lại.

+1

Và đối với độc giả, có yêu cầu làm thế nào điều này có thể hữu ích? Hai ví dụ: 1) Lấy các phần tử được đánh số lẻ từ một vectơ danh sách 'vectơ [c (T, F)]', lấy mỗi phần tử thứ 3 'vectơ [c (F, F, T)]' 2) Điền một data.frame/ma trận nhanh chóng 'data.frame (class =" A ", giá trị = rnorm (100))' – Vlo

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