programing

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

lovejava 2023. 6. 8. 19:07

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

R에 data.frame이 있습니다.저는 두 개의 다른 열에 두 가지 다른 조건을 시도하고 싶지만, 이러한 조건이 포함되기를 원합니다.따라서 "OR"를 사용하여 조건을 조합하고 싶습니다.저는 이전에 "AND" 조건을 사용하고 싶었을 때 다음 구문을 사용한 적이 있습니다.

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

하지만 위에서 'OR'를 사용하는 방법을 모르겠습니다.

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

'&'을 사용할 때 인수 순서가 중요할 수 있습니다.

"|"을 찾고 있습니다. http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors 을 참조하십시오.

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

완전성을 위해 연산자를 사용할 수 있습니다.[그리고.[[:

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

동일한 조건에 대해 여러 열을 테스트하려는 경우 적용 가능한 확장성이 뛰어난 솔루션을 원하는 사용자는Reduce또는rowSums.

샘플 데이터

df <- base::expand.grid(x = c(0, 1),
                        y = c(0, 1),
                        z = c(0, 1))
df
#>   x y z
#> 1 0 0 0
#> 2 1 0 0
#> 3 0 1 0
#> 4 1 1 0
#> 5 0 0 1
#> 6 1 0 1
#> 7 0 1 1
#> 8 1 1 1

해결책

0이 들어 있습니까?1로 채워진 8행을 제외한 모든 행을 유지합니다.

함수 + 위치Reduce()TRUE 값을 포함하는 경우 결과가 0보다 높기 때문에 기본적으로 OR 연산자로 작동합니다.

## Reduce ---------------------------------------------------
df[Reduce(f = `+`, x = lapply(df, `==`, 0)) > 0, ]
#>   x y z
#> 1 0 0 0
#> 2 1 0 0
#> 3 0 1 0
#> 4 1 1 0
#> 5 0 0 1
#> 6 1 0 1
#> 7 0 1 1

## rowSums --------------------------------------------------
df[rowSums(df == 0) > 0, ]
#>   x y z
#> 1 0 0 0
#> 2 1 0 0
#> 3 0 1 0
#> 4 1 1 0
#> 5 0 0 1
#> 6 1 0 1
#> 7 0 1 1

다중 AND 조건

사용할 수 있습니다.Reduce또한 쉽게 다중을 적용할 수 있습니다.AND사용 조건*대신에+모든 논리에 값을 곱하면 값만 반환됩니다.>0모든 경우에 있어서는TRUE.

df[Reduce(`*`, lapply(df, `==`, 0)) > 0, ]
#>   x y z
#> 1 0 0 0

A data.table완전성 옵션:

library(data.table)
dt <- data.table(V1 = runif(10, 0, 1),
                 V2 = letters[1:10])

dt[V1 > 0.5 | V2 == "b",]
#>           V1 V2
#> 1: 0.7294220  a
#> 2: 0.9717687  b
#> 3: 0.7177076  c
#> 4: 0.5963838  e
#> 5: 0.5456320  i

reprex 패키지(v2.0.1)에 의해 2022-07-10에 생성되었습니다.

이 유용한 패키지에 대한 자세한 내용은 이 링크를 참조하십시오.

언급URL : https://stackoverflow.com/questions/4935479/how-to-combine-multiple-conditions-to-subset-a-data-frame-using-or