京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

【Rのジミ〜な小技シリーズ】ベクトルに「含まれる」「含まれない」要素の取り出し、論理値について

はじめに

処理途中で、ある数値・ある文字列が、こっちのベクトルにも含まれるのか、何番目に出現するのか等を考えると、しばしば悩ましい状況となります。。

この記事では、このような、R環境でのベクトル間の関係性を調べる方法を紹介します。きっと、役に立つシーンが多いはずです。

あるベクトルから他ベクトルに「含まれる要素」あるいは「含まれない要素」を抽出する方法

例1: 共通に含まれている要素を取り出す

あるベクトルから他ベクトルに含まれる要素(共通要素)の抽出を実行します。

%in%という特殊な論理子を扱います。

x <- c(1, 2, 3, 4, 5)
y <- c(4, 5, 6, 7, 8)

# x を基準にする場合
a <- x %in% y
a
#[1] FALSE FALSE FALSE  TRUE  TRUE
x0 <- x[a]
x0
#[1] 4 5

# y を基準にする場合
b <- y %in% x
b
#[1]  TRUE  TRUE FALSE FALSE FALSE
y[b]
#[1] 4 5

例2: 共通に含まれない要素を取り出す

ここでは、あるベクトルから他ベクトルに含まれない要素(非共通要素)、x %in% yの論理値の逆を求めます。 つまりは、!でTRUE・FALSEを逆転させます。

x <- c("A", "B", "C", "D", "E")
y <- c("F", "C", "A", "G", "E")

# ベクトル y に含まれない ベクトル x の要素を取り出す
c<- !(x %in% y)
c
#[1] FALSE  TRUE FALSE  TRUE FALSE

x[c]
#[1] "B" "D"

# ベクトル x に含まれない ベクトル y の要素を取り出す
d <- !(y %in% x)
d
#[1]  TRUE FALSE FALSE  TRUE FALSE

y[d]
#[1] "F" "G"

ベクトル間で、「すべて」あるいは「いずれか」と一致する関係があるか?

ここでは、all関数とany関数の使い方を解説します。

z <- c(1, 2, 3)

#ベクトル内のすべてと一致するかで、「TRUE」を返す
all(z == z)
#[1] TRUE

all(z == 1)
#[1] FALSE

#ベクトル内のいずれかと一致するかで、「TRUE」を返す
any(z == z)
#[1] TRUE

any(z == 1)
#[1] TRUE

まとめ

%in%all()any() はマイナーな関数だけど、使える様になれば、プログラムの組み方が広がるはずです。。

参考

kenpg2.seesaa.net

stackoverflow.com

【Rのジミ〜な小技シリーズ】

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net