여러 조건을 기반으로 data.frame 그룹 필터링

Oct 13 2020

여러 조건에 따라 특정 빅 데이터 프레임 그룹의 값을 필터링하는 우아한 방법을 찾고 있습니다.

내 데이터 프레임은 다음과 같습니다.

data=data.frame(group=c("A","B","C","A","B","C","A","B","C"), 
                time= c(rep(1,3),rep(2,3), rep(3,3)), 
                value=c(0.2,1,1,0.1,10,20,10,20,30))

  group time value
1     A    1   0.2
2     B    1   1.0
3     C    1   1.0
4     A    2   0.1
5     B    2  10.0
6     C    2  20.0
7     A    3  10.0
8     B    3  20.0
9     C    3  30.0

시점 1에서만 1보다 작지만 0.1보다 큰 모든 값을 필터링하고 싶습니다.

내 data.frame이 이렇게 보이기를 원합니다.

  group time value
1     A    1   0.2
4     A    2   0.1
5     B    2  10.0
6     C    2  20.0
7     A    3  10.0
8     B    3  20.0
9     C    3  30.0

어떤 도움이라도 대단히 감사합니다.

답변

1 Adamm Oct 13 2020 at 12:36

또는 자유 시간이 너무 많고 피하기로 결정한 경우 dplyr:

ind <- with(data, (data$time==1 & (data$value > 0.1 & data$value < 1))) ind <- ifelse((data$time==1) & (data$value > 0.1 & data$value < 1), TRUE, FALSE)
#above two do the same

data$ind <- ind data <- data[!(data$time==1 & ind==F),]
data$ind <- NULL

  group time value
1     A    1   0.2
4     A    2   0.1
5     B    2  10.0
6     C    2  20.0
7     A    3  10.0
8     B    3  20.0
9     C    3  30.0
3 RicS Oct 13 2020 at 12:03

dplyr당신 과 함께 할 수 있습니다

library(dplyr)

data %>% filter(!(time == 1 & (value <= 0.1 | value >= 1))) 

#   group time value
# 1     A    1   0.2
# 2     A    2   0.1
# 3     B    2  10.0
# 4     C    2  20.0
# 5     A    3  10.0
# 6     B    3  20.0
# 7     C    3  30.0
AlexB Oct 15 2020 at 10:36

또 다른 간단한 옵션은 subset두 번 사용한 다음 결과를 행 현명한 방식으로 추가하는 것입니다.

rbind(
  subset(data, time == 1 & value > 0.1 & value < 1),
  subset(data, time != 1)
)

#    group time value
# 1     A    1   0.2
# 4     A    2   0.1
# 5     B    2  10.0
# 6     C    2  20.0
# 7     A    3  10.0
# 8     B    3  20.0
# 9     C    3  30.0