現在、Rではいくつかの通貨で作業していますが、2つのデータセットをマージまたはオーバーライドして作成する必要があります。時間と変数IDで2つのデータフレームをNAsでマージ
すべての通貨で、私はDF1
に1980年から2017年までのデータを持っています。そのうち16人は、1970年から1975年の間、2017年の異なる地点からDF2
にデータがあります。私がしたいことは、DF1
の上にDF2
から1970-1980の部分を入れることです。私はDF1
をDF2
にマージして両方の値を持つセル(DF1
オーバーライドDF2
)にマージすると同じ結果が得られると思います。しかし、開始日はすべての通貨で正確に等しいわけではないので、私はそれをハードコードすることはできません。
次のような例を示します。 Date
は、時間変数(月次データ)です。 DF1
は1980-2017のデータに対応し、DF2
は1970-2017のデータに対応します。私の目的は、列IDと行IDの両方に基づいてDF1
の値をDF2
に上書きすることです。 DF3
は、DF1のNAsを使用せずに、DF2の値だけを出力することが望ましい出力です。
set.seed(1234)
DF1=data.frame(matrix(data=c(c(4:9),rnorm(30)),6,6))
set.seed(4321)
DF2=data.frame(matrix(data=c(c(1:12),rnorm(36)),12,4))
names(DF1)=c("Date","Currency1","Currency3","Currency6","Currency7","Currency8")
names(DF2)=c("Date","Currency1","Currency2","Currency3")
DF1$Currency3[1:2]=NA
DF1$Currency1[4:5]=NA
> DF1
Date Currency1 Currency3 Currency6 Currency7 Currency8
1 4 -1.2070657 NA -0.77625389 -0.8371717 -0.6937202
2 5 0.2774292 NA 0.06445882 2.4158352 -1.4482049
3 6 1.0844412 -0.5644520 0.95949406 0.1340882 0.5747557
4 7 NA -0.8900378 -0.11028549 -0.4906859 -1.0236557
5 8 NA -0.4771927 -0.51100951 -0.4405479 -0.0151383
6 9 0.5060559 -0.9983864 -0.91119542 0.4595894 -0.9359486
> DF2
Date Currency1 Currency2 Currency3
1 1 -0.42675738 -1.260985237 -0.09920208
2 2 -0.22361182 1.139464085 -0.23803425
3 3 0.71760679 -1.221781923 0.04778266
4 4 0.84144567 1.573315888 0.29651274
5 5 -0.12835727 0.073477874 -0.83380992
6 6 1.60934721 -1.175115087 -1.37397000
7 7 -0.29716745 -1.588261899 0.14027895
8 8 0.19600465 -0.747380729 0.66212596
9 9 1.24074620 0.483521864 1.13103967
10 10 -0.71869815 -0.003025539 -0.47511202
11 11 -0.06723632 -0.008930402 0.85241411
12 12 0.34436710 0.593357619 -0.75151885
DF1
内のデータの一部が、このコードはDF2
に上書きされますされ、その中にNA
秒を持って、私は、ユーザーからこの答えを得たが、私は新しい問題に遭遇しました。あなたがifelse
を使用することができDF1
に非欠落対応するものがDF3
における値のみを交換すること
library(data.table)
DF3 <- copy(DF2)
nm1 <- names(DF1)[-1]
setDT(DF3)[DF1, (nm1) := mget(paste0("i.", nm1)), on = .(Date)]
> DF3
Date Currency1 Currency2 Currency3 Currency6 Currency7 Currency8
1: 1 1.1022975 -0.8553646 -0.162309524 NA NA NA
2: 2 -0.4755931 -0.2806230 0.563055819 NA NA NA
3: 3 -0.7094400 -0.9943401 1.647817473 NA NA NA
4: 4 -1.2070657 -0.9685143 NA -0.77625389 -0.8371717 -0.6937202
5: 5 0.2774292 -1.1073182 NA 0.06445882 2.4158352 -1.4482049
6: 6 1.0844412 -1.2519859 -0.564451999 0.95949406 0.1340882 0.5747557
7: 7 NA -0.5238281 -0.890037829 -0.11028549 -0.4906859 -1.0236557
8: 8 NA -0.4968500 -0.477192700 -0.51100951 -0.4405479 -0.0151383
9: 9 0.5060559 -1.8060313 -0.998386445 -0.91119542 0.4595894 -0.9359486
10: 10 -0.4658975 -0.5820759 -0.669633580 NA NA NA
11: 11 1.4494963 -1.1088896 -0.007604756 NA NA NA
12: 12 -1.0686427 -1.0149620 1.777084448 NA NA NA
してください、使用 'set.seed(1234)' 'サンプルをランダムに生成した値を使用する場合や、再生可能なデータを作成します()'。ありがとうございました。 – Uwe
確かに、それが役に立ちます。 – NielsJo
DF2に別のset.seed()を使用して、アプローチが有効かどうかを確認できるようにしてください。例については私の更新答えを見てください。 – Jaap