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


174

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

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

しかし、上記で「OR」を使用する方法がわかりません。

回答:


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

この関数の動作を模倣し、関数本体に含めるのにより適切な代替ソリューション:

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

一部の人々は、which不要な使用を批判しますが、NA値が不要な結果を返すのを防ぎます。上記の2つのオプションと同等のもの(つまり、V1またはV2のNAのNA行を返さない)は、次のようにwhichなります。

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

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

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

「&」を使用する場合、引数の順序が重要になることがあります。


1
これは最高の投票問題であり、その後1発見: stackoverflow.com/questions/9860090/...
PatrickT

1
利点は、コンパクトで理解しやすいことです。欠点は、機能構築タスクでのユーティリティの欠如です。これを複製したい場合[は、ラップインするwhichか、追加の!is.na制約を使用する必要があります。
IRTFM

「どっちが」必要ですか、そうでない場合、なぜそれを使用しますか?
クレブ2015

1
「必須」ではありませんが、を省略した場合は異なる結果が得られる可能性がありますwhich。V1とV2の両方がNAの場合、省略した場合、その位置にNAの行が表示されますwhich。私は大規模なデータセットを操作しますが、NAの比較的小さなパーセンテージでさえも、画面をジャンク出力でいっぱいにしてしまいます。これは機能だと考える人もいます。私はしません。
IRTFM、2015

これらの条件に加えて、目的の行のパターンマッチングを行うために、これへの呼び出しgreplまたはgrepこれを含める方法を教えてください。
user5359531 2017

31

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

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

これは、の存在に強くないNAデータフレームでS:vc <- data.frame(duzey=factor(c("Y","O","Y","D","Y","Y","O"), levels=c("D","O","Y"), ordered=TRUE), cinsiyet=c("E","E","K",NA,"K","E","K"), yas=c(8,3,9,NA,7,NA,6), Not=c(NA,1,1,NA,NA,2,1)); vc; vc[vc$cinsiyet == "E" | vc$Not < 4,]; vc[vc$cinsiyet == "E" & vc$Not < 2,]
エルドアンCEVHER

17

完全を期すために、演算子[[[

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

1
たとえば、1つのAND条件と3つのOR条件を条件に、これをどのように実行しますか。たとえば、my.data.frame <-data [data $ V3> 10&((data $ V1> 2)|(data $ V2 <4)| (data $ V4 <5)、]。これを実行しても機能しません
R Guru

1
うわー!sqldfパッケージには、あまりにも良いです。特にsubset()少し痛いときに非常に便利です:)
Dawny33
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.