看來,應該選擇每一行,其中y是值之一在x(?)所以在這個例子中,11和12出現在「月」中的所有情況。
如果您不瞭解查看示例的行爲,請自行嘗試。例如,你可以這樣做:
> c(1,2,3) %in% c(2,4,6)
[1] FALSE TRUE FALSE
所以看起來%in%
爲您提供了對應於每個第一個參數(一%in%
之前)項目的TRUE
和FALSE
值的向量。讓我們嘗試另:
> c(1,2,3) %in% c(2,4,6,8,10,12,1)
[1] TRUE TRUE FALSE
也證實了這一點:在返回的向量的第一個項目是TRUE
如果在第一個參數中的第一項第二個參數中找到任何地方,等等。這個結果比較你開始使用match()
之一:
> match(c(1,2,3), c(2,4,6,8,10,12,1))
[1] 7 1 NA
所以match()
和%in%
之間的區別在於,前者讓你在第一個參數中每個項目的第一場比賽的第二個參數的實際位置,而%in%
爲您提供了一個邏輯向量,它告訴您第一個參數中的每個項目是否出現在第二個參數中。
在Wickham的書籍範例中,month
是表示各航班發生月份的值的向量。因此,對於參數的緣故,有點像:
> month <- c(2,3,5,11,2,9,12,10,9,12,8,11,3)
使用%in%
操作,讓您打開該向量到問題的答案這是飛行本月11或12?這樣的:
> month %in% c(11,12)
[1] FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE
[13] FALSE
它給你一個合理的載體,即真/假值的列表。 filter()
函數使用該邏輯向量從flights
表中選擇相應的行。一起使用,filter
和%in%
回答這個問題在11或12個月內發生的所有航班是什麼?
如果你變成了%in%
周圍,轉而問道:
> c(11,12) %in% month
[1] TRUE TRUE
你真的只是問是否有每個月11月和12中的任何航班嗎?
我可以想象,詢問一個大矢量是否「在」一個只有兩個值的矢量中似乎很奇怪。考慮將x %in% y
編爲來自x
的每個值是否也在y
?
我傾向於將%y中的x%讀爲「x在y中」。 '%in%'操作符是'match'的有用包裝器,其中y是'match'的「table」參數。也就是說,y是用於比較的一組值。如果一個x的元素在y中,'%in%'操作符返回一個邏輯向量x的長度爲TRUE。類似地,'match'返回長度爲x的inteder向量與表(y)中x的位置(索引)。 – lmo
如果您熟悉SQL,那麼這與sql語句相同:'select * from from flights where month in(11,12)'。 –
@lmo我認爲這是一個混淆的地方,儘管......與具有多個值的向量可以「在」具有2個值的向量中是違反直覺的。如果你將它看作「x的元素在y中」,那麼理解x中的所有x不必包含在y中會容易一些。 – Caleb