2017-09-27 1 views
1

3 개의 데이터 열 (a, b, c)과 각 카테고리 (클래스)의 인스턴스가 여러 개인 범주가있는 데이터 프레임이 있다고 가정 해보십시오.값이 다른 데이터 프레임보다 큰 서브 세트 데이터 프레임

set.seed(273) 
a <- floor(runif(20,0,100)) 
b <- floor(runif(20,0,100)) 
c <- floor(runif(20,0,100)) 
class <- floor(runif(20,0,6)) 

df1 <- data.frame(a,b,c,class) 

print(df1) 
    a b c class 
1 31 73 28  3 
2 44 33 57  3 
3 19 35 53  0 
4 68 70 39  4 
5 92 7 57  2 
6 13 67 23  3 
7 73 50 14  2 
8 59 14 91  5 
9 37 3 72  5 
10 27 3 13  4 
11 63 28 0  5 
12 51 7 35  4 
13 11 36 76  3 
14 72 25 8  5 
15 23 24 6  3 
16 15 1 16  5 
17 55 24 5  5 
18 2 54 39  1 
19 54 95 20  3 
20 60 39 65  1 

와 나는 그러나 이것은 단지 종류 (클래스)마다 하나 개의 인스턴스가 데이터 및 카테고리 열의 같은 3 열 다른 데이터 프레임을 가지고있다.

a <- floor(runif(6,0,20)) 
b <- floor(runif(6,0,20)) 
c <- floor(runif(6,0,20)) 
class <- seq(0,5) 

df2 <- data.frame(a,b,c,class) 

print(df2) 
    a b c class 
1 8 15 13  0 
2 0 3 6  1 
3 14 4 0  2 
4 7 10 6  3 
5 18 18 16  4 
6 17 17 11  5 

방법 I가 첫 번째 데이터 프레임의 서브 세트되도록 A, B, C는 모두 각 클래스에 대한 제 2 데이터 프레임에서의 값보다 큰 경우에만 행? 예를 들어, 단지 행을 원할 때 class == 0 인 경우 a > 8 & b > 15 & c > 13입니다.

두 번째 데이터 프레임이 첫 번째 데이터 프레임에 대해 가장 낮은 허용 값이기 때문에 데이터 프레임에 가입하고 싶지 않습니다.

+1

감사 프랭크, 나는 재현 예를 추가했습니다. – thebigmcrae

답변

2

프랭크에 의해 논평 된대로 비공유 조인으로 수행 할 수 있습니다.

# coerce to data.table 
tmp <- setDT(df1)[ 
    # non-equi join to find which rows of df1 fulfill conditions in df2 
    setDT(df2), on = .(class, a > a, b > b, c > c), rn, nomatch = 0L, which = TRUE] 

# return subset in original order of df1 
df1[sort(tmp)] 
 a b c class 
1: 31 73 28  3 
2: 44 33 57  3 
3: 19 35 53  0 
4: 68 70 39  4 
5: 92 7 57  2 
6: 13 67 23  3 
7: 73 50 14  2 
8: 11 36 76  3 
9: 2 54 39  1 
10: 54 95 20  3 
11: 60 39 65  1 

대신 설정된 결합 데이터의 일치하는 행 번호의 벡터를 반환 which = TRUE 파라미터

. 이렇게하면 조인 전에 행 ID 열을 만들지 않아도됩니다. (신용은 which 매개 변수의 저를 생각 나게 @Frank합니다!) df2에서 class == 5의 조건을 충족 df1에는 행이 없다는 것을

참고. 따라서 매개 변수 nomatch = 0L은 일치하지 않는 행을 결과에서 제외시키는 데 사용됩니다.

는 "한 - 라이너 '에 함께 넣을 수 있습니다

setDT(df1)[sort(df1[setDT(df2), on = .(class, a > a, b > b, c > c), nomatch = 0L, which = TRUE])] 
관련 문제