合并具有条件的两个数据帧

时间:2014-05-23 18:06:00

标签: r

我想合并名为data.framedf1的2 df2,因此我想从df2中获取行并将其添加到df1中如果来自2个特定列的值匹配,否则我将保留df1的行。换句话说,我不希望有重复的数据。以下是长data.frame s:

的示例
df1 <- data.frame(
    X = c(18,20,21,27,50),
    Y = c(4,5,6,9,8),
    Z = c(1,0.3,0.4,0.7,0.9)
)

df2 <- data.frame(
    X = c(20,40,50,),
    Y = c(1,4,8),
    Z = c(2.2,0.3,0.6)
)

由于df1的第5行和df2的第3行在XY匹配,我将其替换,因此我不必采取{ {1}}正在考虑中。

所以我的Z会是这样的:

df

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

我认为您只想在所需的列上使用rbindrbind.data.frame,然后unique,并使用rownames索引:

df3 <- rbind.data.frame(df1, df2)
df3[rownames(unique(df3[, -3])), ]

##    X Y   Z
## 1 18 4 1.0
## 2 20 5 0.3
## 3 21 6 0.4
## 4 27 9 0.7
## 5 50 8 0.9
## 6 20 1 2.2
## 7 40 4 0.3

答案 1 :(得分:1)

这应该有效

mm<-merge(df1, df2, all=T, by=c("X","Y"))
mm<-transform(mm,
    Z=ifelse(is.na(Z.x), Z.y, Z.x),
    Z.x=NULL,
    Z.y=NULL)
mm
#    X Y   Z
# 1 18 4 1.0
# 2 20 1 2.2
# 3 20 5 0.3
# 4 21 6 0.4
# 5 27 9 0.7
# 6 40 4 0.3
# 7 50 8 0.9

这里我们合并了两个数据集中的所有值,然后我们从第一个表中填入缺少的Z值和第二个表的值。然后我们清理临时列。