2017-09-05 96 views
3

我對理解%in%有困難。在Hadley Wickham的書「R for data science」的第5.2.2節中,它說:「這個問題的一個有用的縮寫是x %in% y。這將選擇每一行,其中x是y中的一個值。那麼這個例子說明:理解對%的解釋的困難%

nov_dec <- filter(flights, month %in% c(11, 12)) 

然而,我當我看語法,看樣子,應該選擇每一行,其中y是x中的值之一,所以在這個例子中,所有的(?) 「月」(x)中出現11和12(y)的情況。

?"%in%"並沒有使我對此更清楚。很顯然,我錯過了一些東西,但是有人可以確切地說明這個功能的工作原理嗎?

+4

我傾向於將%y中的x%讀爲「x在y中」。 '%in%'操作符是'match'的有用包裝器,其中y是'match'的「table」參數。也就是說,y是用於比較的一組值。如果一個x的元素在y中,'%in%'操作符返回一個邏輯向量x的長度爲TRUE。類似地,'match'返回長度爲x的inteder向量與表(y)中x的位置(索引)。 – lmo

+0

如果您熟悉SQL,那麼這與sql語句相同:'select * from from flights where month in(11,12)'。 –

+0

@lmo我認爲這是一個混淆的地方,儘管......與具有多個值的向量可以「在」具有2個值的向量中是違反直覺的。如果你將它看作「x的元素在y中」,那麼理解x中的所有x不必包含在y中會容易一些。 – Caleb

回答

7

看來,應該選擇每一行,其中y是值之一在x(?)所以在這個例子中,11和12出現在「月」中的所有情況。

如果您不瞭解查看示例的行爲,請自行嘗試。例如,你可以這樣做:

> c(1,2,3) %in% c(2,4,6) 
[1] FALSE TRUE FALSE 

所以看起來%in%爲您提供了對應於每個第一個參數(一%in%之前)項目的TRUEFALSE值的向量。讓我們嘗試另:

> 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

+1

非常感謝您提供了完整的解釋。我現在明白了! –

0

此明確表示:從X也沿y 瞭解的最好辦法值一爲例:

x <- 1:10 # numbers from 1 to 10 
y <- (1:5)*2 # pair numbers between 2 and 10 

y %in% x # all pair numbers between 2 and 10 are in numbers from 1 to 10 

x %in% y #only pair numbers are return as True 
2

一個快速的鍛鍊應該足夠證明功能的工作原理:

> x <- c(1, 2, 3, 4) 
> y <- 4 
> z <- 5 

> x %in% y 
[1] FALSE FALSE FALSE TRUE 

所以數字矢量x的第四個要素是存在於數字矢量y

> y %in% x 
[1] TRUE 

y的第一個元素(只有一個)是x

> z %in% x 
[1] FALSE 
> x %in% z 
[1] FALSE FALSE FALSE FALSE 

而且,無論zx也沒有任何的xz

另請參閱幫助所有匹配的功能與?match

1

我想了解它的工作原理是有些語義,一旦你可以說,它在邏輯上則語法工作本身了。

關鍵是在你的頭腦中創建一個句子,當你讀代碼時,當你在每一行工作時,包括apply的上下文,布爾邏輯根據包含的內容包含或排除行在「按列表過濾」%in% c()

nov_dec <- filter(flights, month %in% c(11, 12)) 

在這種情況下爲您的例如上面應該讀這樣的:

「設置可變nov_dec等於行中flights,其中變量柱month(從那些行)是在該子集中列表c(11,12)。「

從頂部r作品下來,它看起來在本月,如果它要麼是1112,在列表中的兩個變量,那麼它包括他們nov_dec,OTH它只是繼續下去。