2つのデータセットを結合しようとしています。それらをxおよびyと呼びます。yのID変数はxのID変数のサブセットであると私は信じています。しかし、xにはyよりも多くのIDが含まれていることはわかっていますが、マッピングがわからないため、純粋な意味ではありません。つまり、xとyのIDの一部(すべてではない)を1:1で一致させることができます。
私の最終的な目標は、この1:1マッピングが失敗する場所を特定し、これらの観測にフラグを立てることです。マージが進むべき道だと思いましたが、そうではないかもしれません。例を以下に示します。
id <- c(1:10, 1:100)
X1 <- rnorm(110, mean = 0, sd = 1)
year <- c("2004","2005","2006","2001","2002")
year <- rep(year, 22)
month = c("Jul","Aug","Sep","Oct","Nov","Dec","Jan","Feb","Mar","Apr")
month <- rep(month, 11)
#dataset X
x <- cbind(id, X1, month, year)
#dataset Y
id2 <- c(1:10, 200)
Y1 <- rnorm(11, mean = 0 , sd = 1)
y <- cbind(id2,Y1)
#merge on the IDs; but we get an error because when id2 == 200 in y we don't
#have a match in x
result <- merge(x, y, by.x="id", by.y = "id2", all =TRUE)
id2 == 200がxデータセットに一致しなかったため、マージはエラーをスローしました。残念ながら、IDとすべての情報も失くしてしまいました。(行111では200に等しいはずです):
tail(result)
id X1 month year Y1
106 95 -0.0748386054887876 Nov 2002 NA
107 96 0.196765325477989 Dec 2004 NA
108 97 0.527922135906927 Jan 2005 NA
109 98 0.197927230533413 Feb 2006 NA
110 99 -0.00720474886698309 Mar 2001 NA
111 <NA> <NA> <NA> <NA> -0.9664941
さらに、マージされたファイルのID変数で重複した観測値を取得します。id2 == 1の観測値は1回しか存在しませんでしたが、2回コピーしただけです(たとえば、Y1は値1.55を2回取得します)。
head(result)
id X1 month year Y1
1 1 -0.67371266313441 Jul 2004 1.553220
2 1 -0.318666983469993 Jul 2004 1.553220
3 10 -0.608192898092431 Apr 2002 1.234325
4 10 -0.72299929212347 Apr 2002 1.234325
5 100 -0.842111221826554 Apr 2002 NA
6 11 -0.16316681842082 Jul 2004 NA
このマージにより、私が意図したよりも複雑になりました。xのすべての観測値を調べて、idがyのid2と一致する場所を特定し、一致しないものにフラグを立てることができることを望んでいました。したがって、新しいベクトルを取得し、それをフラグと呼びます。これは、x$idがy$id2で一致する場合は値1を取り、それ以外の場合はゼロを取ります。このようにして、1:1マッピングがどこで失敗したかを知ることができました。NAを再コーディングすることで、これをある程度牽引できる可能性がありますが、id2 ==200の場合にスローされるエラーについてはどうでしょうか。情報を破棄するだけです。
運が悪かったので行を追加しようとしましたが、マージもあきらめるべきだと思われます。おそらく、これらの行に沿って何かを行うためにループまたは関数を絞ったほうがよいでしょう。
xのすべての観測に対して
id2 = which(id2)はid-month-yearに対応します
上記の長さが==1の場合はフラグ=1、それ以外の場合は0
等
うまくいけば、これはすべて理にかなっています。助けや指導をいただければ幸いです。