%in%の反対


262

データフレームD1のカテゴリ変数V1は、AからZまでの文字で表される値を持つことができます。サブセットD2を作成します。これは、一部の値、たとえば、B、N、Tを除外します。基本的に、次のようなコマンドが必要です。の反対 %in%

D2 = subset(D1, V1 %in% c('B','N',T'))

66
ありませんで%?(!(x %in% y))。人生はときどき楽になることがある...
Joris Meys

回答:


355

!演算子を使用して、基本的にTRUE FALSEおよびすべてのFALSE TRUEを作成できます。そう:

D2 = subset(D1, !(V1 %in% c('B','N','T')))

編集:自分で演算子を作成することもできます:

'%!in%' <- function(x,y)!('%in%'(x,y))

c(1,3,11)%!in%1:10
[1] FALSE FALSE  TRUE

5
2番目のオプションの使用は?"%in%"、新しい演算子が呼び出されるヘルプ(一致)ページ(入力すると表示される場所)に示されています%w/o%
IRTFM 2011

23
また、?Negate例を参照してください"%ni%" <- Negate("%in%")
baptiste

2
Negateは、新しい演算子を定義した後に使用した場合subset(df, variable %ni% c("A", "B"))、たとえばsubset(df, variable Negate("%in%") c("A", "B"))
baptiste

2
@PatrickTこれは、演算子として使用できるのは演算子だけだからです。演算子は組み込み、またはで始まり、で終わり%ます。演算子を作成するには、2つのオペランドを持つ関数を、で始まり、で終わる名前に割り当てる必要があります%
空飛ぶ羊


31

のコードを見ると %in%

 function (x, table) match(x, table, nomatch = 0L) > 0L

その後、反対のバージョンを書くことができるはずです。私が使う

`%not in%` <- function (x, table) is.na(match(x, table, nomatch=NA_integer_))

別の方法は:

function (x, table) match(x, table, nomatch = 0L) == 0L

優れたソリューション..通常の否定が失敗したときに機能しました。
アガサ

17

これは、論理を!で否定することにより、受け入れられた回答と同じ手法を適用するfilterin dplyrを使用するバージョンです。

D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))

12

negatefrom を使用することでpurrrも、トリックをすばやくかつ適切に実行できます。

`%not_in%` <- purrr::negate(`%in%`)

次に、使用法は、例えば、

c("cat", "dog") %not_in% c("dog", "mouse")

2
Negate同じことをするビルトインもあります。唯一の違いは、purrrコールであるas_mapperあなたがいる間、渡す事にNegate呼び出しmatch.funrdocumentation.org/packages/purrr/versions/0.2.5/topics/... stat.ethz.ch/R-manual/R-devel/library/base/html/match.fun.html
飛んで羊

7

purrr::compose() これを後で使用するために定義する別の簡単な方法です。

`%!in%` <- compose(`!`, `%in%`)

3

別の解決策は setdiff

D1 = c("A",..., "Z") ; D0 = c("B","N","T")

D2 = setdiff(D1, D0)

D2 は希望するサブセットです。




0
library(roperators)

1 %ni% 2:10

これは正解かもしれませんが、それが機能する理由をさらに説明すると、より役立つでしょう。さらに詳細を含めるように編集することを検討してください。10年近く前に投稿された承認済みの回答よりも優れていると思われる場合は、
Jeremy Caney


-1

%in%のヘルプhelp("%in%")には、「例」セクションに、「ではない」のこの定義が含まれています。

"%w/o%" <- function(x, y) x[!x %in% y] #-- x without y

試してみよう:

c(2,3,4) %w/o% c(2,8,9)
[1] 3 4

あるいは

"%w/o%" <- function(x, y) !x %in% y #--  x without y
c(2,3,4) %w/o% c(2,8,9)
# [1] FALSE  TRUE  TRUE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.