2016-07-19 5 views
0

私は2つのデータフレームを持っています。 df2のSysIdが0の場合、私はSysIdとAppIdをマージしてフラグを取得しなければならない場合、AppIdによってdf1にマージする必要があります。異なる結合条件に基づいてR内のデータフレームをマージするか?

私は2つのステップでラウンドを行い、マージ後に2つのフラグ列に基づいて新しい列を作成する機能を追加しました。私は別の結合条件に基づいてマージし、同じ列に取得する必要があります。また、私が作ったやり方は、より良い方法がありますか?事前のおかげで

df1 = data.frame(
SysId=rep(1001:1003,3), 
AppId=c(rep("A",3),rep("B",3),rep("C",3)) 
       ) 

df2 = data.frame(
SysId=c(1002,1003,0), 
AppId=c("A","B","C"), 
Flag="Y" 
) 

df1 

    SysId AppId 
    1 1001  A 
    2 1002  A 
    3 1003  A 
    4 1001  B 
    5 1002  B 
    6 1003  B 
    7 1001  C 
    8 1002  C 
    9 1003  C 

df2 

     SysId AppId Flag 
    1 1002  A Y 
    2 1003  B Y 
    3  0  C Y 

    Final Expected Result 
    SysId AppId  Flag 
    1 1001  A   
    2 1002  A   Y 
    3 1003  A 
    4 1001  B 
    5 1002  B 
    6 1003  B   Y 
    7 1001  C   Y 
    8 1002  C   Y 
    9 1003  C   Y 

df1 <- merge(x=df1,y=df2[df2$SysId == 0, c("AppId","Flag")],by=c("AppId"), all.x=TRUE) 
df1 <- merge(x=df1,y=df2,by=c("SysId","AppId"), all.x=TRUE) 

    After Merging two times 
     SysId AppId Flag.x Flag.y 
    1 1001  A <NA> <NA> 
    2 1001  B <NA> <NA> 
    3 1001  C  Y <NA> 
    4 1002  A <NA>  Y 
    5 1002  B <NA> <NA> 
    6 1002  C  Y <NA> 
    7 1003  A <NA> <NA> 
    8 1003  B <NA>  Y 
    9 1003  C  Y <NA> 
+0

それは複雑なルールのようなものです。私は、マージロジックの条件ワイルドカード仕様を認識していません。たぶんSQLにはそういうことがありますか? –

+0

私はあなたの解決策は良いと思います。今すぐ 'df1 $ Flag < - ifelse(is.na(df1 $ Flag.x)、df1 $ Flag.y、df1 $ Flag.x)'を実行してください。 Flag.xとFlag.yのフラグが違うとどうなりますか? – dash2

+0

あなたのクイック回答は42とdash2になります。 – user3254389

答えて

1

あなたは「キー」欄に「マージ」、そしてように、この新しいコラムで正常にマージからロジックを移動することができます:

df1 <- data.frame(SysId=rep(1001:1003,3),AppId=c(rep("A",3),rep("B",3),rep("C",3)),stringsAsFactors=FALSE) 
df2 <- data.frame(SysId=c(1002,1003,0),AppId=c("A","B","C"),Flag="Y",stringsAsFactors=FALSE) 

# move the condition to the key 
df2$key <- ifelse(df2$SysId==0,df2$AppId,paste0(df2$SysId,df2$AppId)) 
df1$key <- ifelse(df1$AppId %in% df2$AppId[df2$SysId==0],df1$AppId,paste0(df1$SysId,df1$AppId)) 

# merge data frames 
df1 <- merge(x=df1,y=df2,by="key",all.x=TRUE) 

# format results 
df1 <- df1[,c("SysId.x","AppId.x","Flag")] 
colnames(df1) <- c("SysId","AppId","Flag") 
df1 <- df1[order(df1$AppId,df1$SysId),] 
関連する問題