如何合并1列上的2列

时间:2015-02-23 15:20:37

标签: r dataframe

我想合并2 df,其中df1包含2列和df2 1列,在这种情况下如何应用函数合并?

以下是示例案例:

df1 <- data.frame(var1=letters[1:5],var2=letters[6:10])
df2 <- data.frame(var3=letters[1:10])

错误尝试:

merge(df1,df2,by.x=c("var1","var2"),by.y="var3",all.y=TRUE)

如何合并这两个df,以便匹配搜索使用df1(var1&amp; var2)的两列并在df2(var3)上运行?

期望的输出:

    var1  var2   var3 
1     a    f       a
2     b    g       b
3     c    h       c
4     d    i       d
5     e    j       e
6     <NA> <NA>    f
7     <NA> <NA>    g
8     <NA> <NA>    h
9     <NA> <NA>    i 
10    <NA> <NA>    j

编辑:改进数据(我希望):

df1 <- data.frame(var1=c(letters[1:5],rep("x",5)),var2=c(letters[6:10],rep("x",5)))
df2 <- data.frame(var3=letters[1:10])

期望的输出:

     var1  var2   var3 
 1     a    f       a
 2     b    g       b
 3     c    h       c
 4     d    i       d
 5     e    j       e
 6     x    x       f
 7     x    x       g
 8     x    x       h
 9     x    x       i 
10     x    x       j

3 个答案:

答案 0 :(得分:5)

根据第一个所需的输出

,这是一个可能的data.table解决方案
library(data.table)
setkey(setDT(df2), var3)
df2[df1, `:=`(var1 = i.var1, var2 = i.var2)][]
#     var3 var1 var2
#  1:    a    a    f
#  2:    b    b    g
#  3:    c    c    h
#  4:    d    d    i
#  5:    e    e    j
#  6:    f   NA   NA
#  7:    g   NA   NA
#  8:    h   NA   NA
#  9:    i   NA   NA
# 10:    j   NA   NA

答案 1 :(得分:5)

你可以merge使用参数by='row.names'sort=F(正如Matthew Plourde所指出的)不要让merge弄乱订单:

> merge(df1, df2, by='row.names', sort=FALSE, all=TRUE)[c("var1", "var2", "var3")]
   var1 var2 var3
1     a    f    a
2     b    g    b
3     c    h    c
4     d    i    d
5     e    j    e
6  <NA> <NA>    i
7  <NA> <NA>    f
8  <NA> <NA>    g
9  <NA> <NA>    h
10 <NA> <NA>    j

答案 2 :(得分:5)

您真的需要根据df2df1重新排序cbind

cbind(df1, df2[order(match(df2$var3, df1$var1)),, drop=FALSE])

如果df2有多列,则不需要drop=FALSE

#    var1 var2 var3
# 1     a    f    a
# 2     b    g    b
# 3     c    h    c
# 4     d    i    d
# 5     e    j    e
# 6     x    x    f
# 7     x    x    g
# 8     x    x    h
# 9     x    x    i
# 10    x    x    j

保持这种方法,对于没有xs的第一个数据集,您可以使用:

cbind(lapply(df1, `length<-`, nrow(df2)), df2[order(match(df2$var3, df1$var1)),, drop=FALSE])

#    var1 var2 var3
# 1     a    f    a
# 2     b    g    b
# 3     c    h    c
# 4     d    i    d
# 5     e    j    e
# 6  <NA> <NA>    f
# 7  <NA> <NA>    g
# 8  <NA> <NA>    h
# 9  <NA> <NA>    i
# 10 <NA> <NA>    j

或者以更易读的方式:

df1 <- lapply(df1, `length<-`, nrow(df2))
df2 <- df2[order(match(df2$var3, df1$var1)),, drop=FALSE]
cbind(df1, df2)