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
'programing' 카테고리의 다른 글
하위 목록(범주 또는 페이지)이 있는 사용자 정의 빵 조각 (0) | 2023.06.13 |
---|---|
Android 활동 수명 주기 - 이 모든 방법은 무엇을 위한 것입니까? (0) | 2023.06.13 |
윈도우즈 인증을 사용하여 SQL Server에 연결 (0) | 2023.06.08 |
PL/SQL 저장 프로시저에서 쉼표로 구분된 문자열 분할 (0) | 2023.06.08 |
iPhone - Grand Central Dispatch 메인 스레드 (0) | 2023.06.08 |