-5

私は2つのデータフレームを持っています:

df1                                              
Column1        Column2        
A               id1             
B               id2             
C               id3             
B               id2             
D               id4             
A               id1             
C               id3

df2
Column1      Column2      Column3
X             m1            m2
A             m3            m4
A             m3            m4
Y             n1            n2
A             m3            m4
Z             p1            p2
X             m1            m2

の列 1 の行がの場合、の列 2に基づいて列 2 と 3 を選択的に結合する必要があるという条件に基づいてマージdf1したいdf2df1Adf2df1

したがって、最終的な df1 は次のようになります。

df1                                                                           

Column1        Column2.1    Column1.2      Column2.2      Column3.2
A               id1             id1             m3            m4
B               id2                                   
C               id3         
B               id2         
D               id4         
A               id1             id1             m3            m4
C               id3         

これまでのところ、df1 の列 1 に「A」を含む行を具体的に抽出することでこれを管理してきました。次に、 for ループ内でマージを適用して、 の両方の列を取得しましたdf2。と の間の条件付きマージを具体的に実行するのに役立つ if ループを持つ可能性はありdf1ますdf2か?

df1との構造は次のdf2とおりです。

df1 <- structure(list(Column1 = structure(c(1L, 2L, 3L, 2L, 4L, 1L, 
3L), .Label = c("A", "B", "C", "D"), class = "factor"), Column2 = structure(c(1L, 
2L, 3L, 2L, 4L, 1L, 3L), .Label = c("id1", "id2", "id3", "id4"
), class = "factor")), .Names = c("Column1", "Column2"), class = "data.frame", row.names = c(NA, 
-7L))


df2 <- structure(list(Column1 = structure(c(2L, 1L, 1L, 3L, 1L, 4L, 
2L), .Label = c("A", "X", "Y", "Z"), class = "factor"), Column2 = structure(c(1L, 
2L, 2L, 3L, 2L, 4L, 1L), .Label = c("m1", "m3", "n1", "p1"), class = "factor"), 
    Column3 = structure(c(1L, 2L, 2L, 3L, 2L, 4L, 1L), .Label = c("m2", 
    "m4", "n2", "p2"), class = "factor")), .Names = c("Column1", 
"Column2", "Column3"), class = "data.frame", row.names = c(NA, 
-7L))
4

1 に答える 1

0

df1 と df2 が上記のように定義されている場合

library(sqldf)


final<-sqldf("select df1.Column1 as Column1 ,df1.Column2,(Select distinct df2.Column2 from df2 where df2.Column1=df1.Column1) as Column2_2,(Select distinct df2.Column3 from df2 where df2.Column1=df1.Column1)as Column3_2 from df1 left join df2 on df1.Column1=df2.Column2")


Column1.2<-ifelse(final$Column1=="A",final$Column2,NA)


final<-cbind(final,Column1.2)
于 2012-12-19T13:12:40.910 に答える