2016-06-11 4 views
0

私はRの初心者ユーザーです。次の問題を抱えています。データフレームのいくつかの列を別のデータフレームで更新する

私は2つのデータフレームをマージしようとしています。私は、2つのデータフレームで、マージしている間に5つの別の重複する列を持っています。私は、これらのオーバーラップする変数をあるデータフレーム内で他のデータフレームに更新しようとしています。私はこのウェブサイトを検索し、いくつかの答えを見つけましたが、私の場合はどれも効率的ではありません。理由は、私は更新するいくつかの列を持っていると第二に、私は最後に100ヶ月のデータをマージする、私はいつも重複している列の名前を知っていることはありません。以前のソリューションは、一般的にコードの各列の名前を書き込むことで更新されますが、名前を使用せずに行う方法を見つけようとしています。一例として、

は、私は年齢とd1だけtuse1とtuse2をマージしたい

tuse1 
age d1 a1 a2 a3 a4 a5 
1 89 2 3 3 NA NA 
2 34 3 4 5 NA NA 

tuse2 
age d1 a1 a2 a3 a4 a5 a6 
1 89 2 3 3 3 6 2 
2 34 3 4 5 4 7 2 
3 32 4 3 3 6 6 6 

...言うことができます。コード内の列名を使用せずにtuse1のNA変数をtuse2で更新できるコードが必要です。

はここで、そのために私のコードです:

key = c("age", "d1") 
comNam = intersect(names(tuse1), names(tuse2)) 
comNam = comNam[3:length(comNam)] 
merge_second_age = merge(x = tuse1, y = tuse2, all = TRUE, by = c(key)) 

for(i in comNam){ 
    left <- paste(i, ".x", sep="") 
    right <- paste(i, ".y", sep="") 

merge_second_age$i = with(merge_second_age, factor(ifelse(is.na(left), right, left))) 
merge_second_age$left = NULL; merge_second_age$right = NULL 
merge_second_age$left = NULL; merge_second_age$right = NULL 

} 

このコードは、所望の出力を与えるものではありません、残念ながらエラーなしで働いているようだけど。

次のように私は見ています所望の出力は次のようになります。

age d1 a1 a2 a3 a4 a5 a6 
    1 89 2 3 3 3 6 2 
    2 34 3 4 5 4 7 2 

私は任意の助けをいただければ幸いです。

ベスト Dilsat

+0

は、あなたの所望の出力を提供することができますか? – 989

+0

希望の出力例がありますか?たとえば、age = 2、d1 = 34の​​2つのdfsで異なる 'a2'の値はどうなりますか? – jalapic

+0

こんにちは@ m0h3n、お返事ありがとうございました。私はちょうど私の質問を編集し、希望の出力を追加しました。私は本当に元のデータセットのようにコード内で変数名を使用することを避けようとしています。これらの重複する列を見つけて更新するコードが必要です。百万回ありがとう!:) – Dilsat

答えて

0

あなたkeyが、これはあなたが何ができるかで、aged1であると仮定します

common=tuse2[intersect(match(tuse1$age,tuse2$age), match(tuse1$d1,tuse2$d1)),] 

は、これはあなたのkey長さ以上2であれば、あなたが何ができるかである。

common=tuse2[Reduce(intersect, list(
match(tuse1$age,tuse2$age), 
match(tuse1$d1,tuse2$d1), 
match(tuse1$a1,tuse2$a1), 
match(tuse1$a2,tuse2$a2), 
match(tuse1$a3,tuse2$a3))) 
,] 

これは同じ出力にあなたのprを与えますovided:

tuse1aged1を条件 tuse2とマージされている
age d1 a1 a2 a3 a4 a5 a6 
1 1 89 2 3 3 3 6 2 
2 2 34 3 4 5 4 7 2 

。さらに、NAの値がtuse1である場合、の値に置き換えられ、但し、ageおよびd1は同じ値である。

DATA

tuse1=structure(list(age = 1:2, d1 = c(89L, 34L), a1 = 2:3, a2 = 3:4, 
    a3 = c(3L, 5L), a4 = c(NA, NA), a5 = c(NA, NA)), .Names = c("age", 
"d1", "a1", "a2", "a3", "a4", "a5"), class = "data.frame", row.names = c(NA, 
-2L)) 

tuse2=structure(list(age = 1:3, d1 = c(89L, 34L, 32L), a1 = 2:4, a2 = c(3L, 
4L, 3L), a3 = c(3L, 5L, 3L), a4 = c(3L, 4L, 6L), a5 = c(6L, 7L, 
6L), a6 = c(2L, 2L, 6L)), .Names = c("age", "d1", "a1", "a2", 
"a3", "a4", "a5", "a6"), class = "data.frame", row.names = c(NA, 
-3L)) 
+0

@Dilsat:私の更新を見てください。 – 989

+0

もう一度ありがとう。しかし、元のデータセットには5つの重要な変数があります。 Intersect関数は、私が理解する限り、2つの変数だけで動作します。私はこの問題をどのように処理できるか考えていますか? – Dilsat

+0

@Dilsatマイアップデートを見る – 989

関連する問題