Để 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
và
> 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
và
> 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
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