R 如何从第二个较小的数据帧替换数据帧中的值?
我对R比较陌生,数据帧有问题。 我有一个很长的数据帧(df1),有一些坐标xy和一个值z。我有一个较短的数据帧(df2),具有相同的列,但行数较少。当xy在df2中相等时,我想替换df1中的值R 如何从第二个较小的数据帧替换数据帧中的值?,r,replace,dataframe,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,
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")
我真的很感谢任何帮助,如果有人提出类似的问题,我很抱歉,我已经花了一整天的时间试图解决这个问题,但我找不到任何适合我的例子。假设两个数据框实际上具有相同的列名(可能只是您问题中的一个输入错误),您可以使用
合并来实现这一点:
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
tmp太感谢了,第二行替换值太棒了,我找不到它。@Eduardo Garza在替换df1中的数据之前,你应该检查df2中的数据是否唯一:任何(重复(df2[c(“x”,“y”)))。你可以使用一行代码创建df2:df2=data.frame(“x”=x1,“y”=y1,“z”=z1)谢谢你,这是一个很好的技巧,所以节省时间
znew = c(8,58,3,1,2,6,8,5,37,2,8,4,4,6,2,23)
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