web-dev-qa-db-ja.com

「OR」を使用して複数の条件を組み合わせてデータフレームをサブセット化する方法

私はRにdata.frameを持っています。2つの異なる列に2つの異なる条件を試したいのですが、これらの条件を包括的にしたいと思います。したがって、条件を組み合わせるには "OR"を使用します。 「AND」条件を使用したい場合は、以前に次の構文を使用して成功しました。

my.data.frame <- data[(data$V1 > 2) & (data$V2 < 4), ]

しかし、私は上記の 'OR'の使い方を知りません。

158
Sam
my.data.frame <- subset(data , V1 > 2 | V2 < 4)

この関数の振る舞いを模倣し、関数本体内に含めるのにより適している代替ソリューション

new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]

必要に応じてwhichを使用することを批判する人もいますが、NAの値が不要な結果をスローするのを防ぎます。 whichを指定せずに上記の2つのオプションと同等のもの(.i.eがV1またはV2のどのNAに対してもNA行を返さない)は、

 new.data <- data[ !is.na(data$V1 | data$V2) & ( data$V1 > 2 | data$V2 < 4)  , ]

注:私は、上のコードのエラーを修正しようとした匿名の貢献者、モデレータによって拒否された修正に感謝します。最初のエラーを修正したときに気付いた追加のエラーが実際にありました。 NA値をチェックする条件節は、それが意図したとおりに処理される場合は最初にある必要があります。

> NA & 1
[1] NA
> 0 & NA
[1] FALSE

引数の順序は '& "を使うときには重要です。

224
42-

あなたは "|"を探しています。 http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors を参照してください。

my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]
26
ncray

完全を期すために、演算子[および[[を使用することができます。

set.seed(1)
df <- data.frame(v1 = runif(10), v2 = letters[1:10])

いくつかのオプション

df[df[1] < 0.5 | df[2] == "g", ] 
df[df[[1]] < 0.5 | df[[2]] == "g", ] 
df[df["v1"] < 0.5 | df["v2"] == "g", ]

df $ nameは と等価です df [["name"、exact = FALSE]]

dplyrを使う:

library(dplyr)
filter(df, v1 < 0.5 | v2 == "g")

sqldfを使う:

library(sqldf)
sqldf('SELECT *
      FROM df 
      WHERE v1 < 0.5 OR v2 = "g"')

上記のオプションの出力

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j
13
mpalanco