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

まずは、データ分析、コマンドラインのメモとして

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

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

このような、ベクトル間の関係性を調べる方法を紹介する。

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

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

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

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の論理値の逆を求める。

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"

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

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