0

私はRに比較的慣れておらず、データフレームに問題があります。いくつかの座標xyと値zを持つ非常に長いデータフレーム(df1)があります。同じ列で行数が少ない短いデータフレーム(df2)があります。fxが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])

しかし、2つのオブジェクトは同じ寸法ではありません。

ループを使用して、各行を分析してxとyを比較し、使用するzを決定しようとしましたが、機能させることができません。

最後に、値を比較し、それが実際に値を変更したことを裏付けるために、zの新しい変数を持つデータフレームが必要です。最終的なデータフレームは次のようになります。

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

助けてくれて本当に感謝しています。他の誰かが同様の質問を投稿してしまった場合は申し訳ありません。私は一日中それを理解しようとしていて、私の場合に適した例を見つけることができません。

4

1 に答える 1

0

2つのデータフレームが実際に同じ列名を持っていると仮定すると(おそらく質問のタイプミスです)、次のように行うことができます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

次に、余分な列を削除して、列の名前を変更します。

于 2012-12-06T06:35:24.353 に答える