2013-08-14 3 views
1

내가 두 dataframes이를 사용하여, 여기에 처음이다 :절차 R

df <- data.frame(p=letters[1:3],y1=c(2,4,3)) 
df 
    p y1 
1 a 2 
2 b 4 
3 c 3 

와 두 번째 :

df2 <- data.frame(p=rep(letters[1:3],c(3,2,4)),y2=c(3,1,1,4,3,4,3,3,1),d=rep(1,length=9)) 
df2 
    p y2 d 
1 a 3 1 
2 a 1 1 
3 a 1 1 
4 b 4 1 
5 b 3 1 
6 c 4 1 
7 c 3 1 
8 c 3 1 
9 c 1 1 

는 내가 뭘 원하는 df2에서 그 라인을 얻을 수있다 여기서 p (a, b, c 등)의 각 값에 대해 d=1 (이 경우 모든 행) 인 경우 y2은 을 df으로 그룹화 한 y1보다 큽니다. a를 들어, y2=3보다 큰 df에서 y1=2라인 6 때문에, 라인 df2 1에 대한 이유는

이 설명은 아마 이해가되지 않기 때문에

가 필요로하는 두 줄은 쫓아 낼 수 df2에서 cy 값 4를 가지고 있지만 df에서 c의 값은 3

나는 data.tables하는 "data.table-솔루션"어쩌면 뭔가처럼, 좋은 것 함께 일하고 있어요 때문에 :

,363,210
setkey(df2,d) 
df2[1,y>??,by="p"] 

답변

6

당신은 부분 집합 전에 merge를 사용해야합니다. base merge 사용

library(data.table) 
merge(data.table(df1,key='p'), 
     data.table(df2,key='p'))[d==1 & y2 > y1] 
    p y1 y2 d 
1: a 2 3 1 
2: c 3 4 1 

: data.table를 사용

subset(merge(df1,df2), d==1 & y2 > y1) 
    p y1 y2 d 
1 a 2 3 1 
6 c 3 4 1 

편집

data.table 솔루션의 경우는, 여기 찾고은 Y [X]를 조인을 사용하는 것이 좋습니다 Y의 행은 X의 키를 사용합니다 (LEFT OUTER JOIN)

RMK하지만 plyr를 사용하는 유사 17,451,515,
DF2 <- data.table(df2,key='p') 
DF1 <- data.table(df1,key='p') 
DF2[DF1][d==1 & y2 > y1] 

    p y2 d y1 
1: a 3 1 2 
2: c 4 1 3 
+0

한 영업 묻는처럼'data.table'를 사용합니다. –

+0

당신은'merge' 대신'['연산자를 사용해야합니다 -'df'와'df2'가 키'p'를 가진'data.table'라고 가정하십시오 :'df [df2] [d == 1 & y2] y1]' – eddi

+0

@eddi 예 감사합니다. 내 대답을 편집합니다. – agstudy

0

시도 :

df3 <- merge(df,df2,by=1) 
> df3 
    p y1 y2 d 
1 a 2 3 1 
2 a 2 1 1 
3 a 2 1 1 
4 b 4 4 1 
5 b 4 3 1 
6 c 3 4 1 
7 c 3 3 1 
8 c 3 3 1 
9 c 3 1 1 


> df3[df3$y2>df3$y1 & df3$d==1,] 
    p y1 y2 d 
1 a 2 3 1 
6 c 3 4 1 
1

:

library(plyr) 
dfa <- data.frame(p=letters[1:3],y1=c(2,4,3)) 
dfa 

dfb <- data.frame(p=rep(letters[1:3],c(3,2,4)),y2=c(3,1,1,4,3,4,3,3,1),d=rep(1,length=9)) 
dfb 

dfb <- join(dfa, dfb, by = "p", type = "left", match = "all") 
dfb 

dfb$z <- ifelse(dfb$y2>dfb$y1, 1, 0) 
dfb[dfb$z==1, ]