"OR"을 사용하여 여러 조건을 결합하여 데이터 프레임의 하위 세트를 만드는 방법은 무엇입니까?


174

R에 data.frame이 있습니다. 두 개의 다른 열에서 두 가지 다른 조건을 시도하고 싶지만 이러한 조건을 포함시키기를 원합니다. 따라서 조건을 결합하기 위해 "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값이 원치 않는 결과를 버리는 것을 막습니다 . 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
이것은 가장 높은 투표 질문하고 하나 발견 : stackoverflow.com/questions/9860090/...
PatrickT

1
장점은 컴팩트하고 이해하기 쉽다는 것입니다. 단점은 기능 구축 작업에 유틸리티가 부족하다는 것입니다. 하나와이 복제하고자하는 경우 [하나 개의 필요에 포장하는 which또는 추가 사용 !is.na제약을.
IRTFM

'어떤'이 필요한가? 그렇지 않은 경우 왜 사용합니까?
Cleb

1
"필수"는 아니지만를 제외하면 다른 결과를 얻을 수 있습니다 which. V1과 V2가 모두 NA 인 경우를 제외하면 해당 위치에 NA 행이 표시 which됩니다. 나는 큰 데이터 세트로 작업하고 상대적으로 적은 비율의 NA조차도 실제로 화면을 정크 출력으로 채 웁니다. 어떤 사람들은 이것이 기능이라고 생각합니다. 난 아니야
IRTFM

이러한 조건 외에도 원하는 행에 대한 패턴 일치를 수행하기 위해 grepl또는에 대한 호출을 어떻게 포함 grep합니까?
user5359531

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,]
Erdogan 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 $ 이름은 동등 DF [ "이름", 일치 = 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
예를 들면 다음과 같습니다. 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.