如何从第二个较小的数据帧中替换数据帧中的值?

时间:2012-12-06 06:26:32

标签: r replace dataframe

我对R比较新,我遇到了数据帧问题。 我有一个很长的数据帧(df1),有一些坐标xy和一个值z。我有一个较短的数据帧(df2),具有相同的列但行数较少。当xy在df2中相等时,我想替换df1中的值。

x = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4) 
y = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4)
z = c(8, 5, 3, 1, 2, 6, 8, 5, 3, 2, 8, 4, 4, 6, 2, 1) 
df1 = data.frame(x, y, z)      

x1=c(1,3,4)
y1=c(2,1,4)
z1=c(58,37,23)

df2=data.frame(x1,y1,z1)
names(df2) <- c("x", "y", "z")

我认为我可能会使用ifelse函数:

df1$znew<-ifelse((df1[,1]== df2[,1])&(df1[,2]==df2[,2]), df2[,3], df1[,3])

但这两个对象的尺寸不一样。

我尝试使用循环,因此它会分析每一行以比较x和y,然后决定使用什么z,但我无法使其工作。

最后,我希望有一个带有z新变量的数据框来比较这些值,并确认它确实改变了这些值。我的最终数据框架如下:

 znew = c(8,58,3,1,2,6,8,5,37,2,8,4,4,6,2,23)

我真的很感激任何帮助,如果其他人发布了类似的问题,我很抱歉,我一整天都想弄清楚,我找不到任何适合我案例的例子。

1 个答案:

答案 0 :(得分:0)

假设两个数据框确实具有相同的列名(可能只是问题中的拼写错误),您可以使用merge执行此操作:

tmp <- merge(df1,df2,all.x = TRUE,by = c('x','y'))
tmp$z.x[!is.na(tmp$z.y)] <- tmp$z.y[!is.na(tmp$z.y)]
> tmp
   x y z.x z.y
1  1 1   8  NA
2  1 2   4   4
3  1 3   3  NA
4  1 4   1  NA
5  2 1   2  NA
6  2 2   6  NA
7  2 3   8  NA
8  2 4   5  NA
9  3 1   4   4
10 3 2   2  NA
11 3 3   8  NA
12 3 4   4  NA
13 4 1   4  NA
14 4 2   6  NA
15 4 3   2  NA
16 4 4   3   3

然后只需删除额外的列并重命名列。