我正在尝试将两个数据集连接在一起。称它们为 x 和 y。我相信 y 中的 ID 变量是 x 中的 ID 变量的子集。但不是纯粹意义上的,因为我知道 x 包含的 ID 比 y 多,但我不知道映射。也就是说,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 数据集中没有匹配项。不幸的是,我丢失了身份证和所有信息!(它应该等于第 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 观察只存在一次,但它只是复制了两次(例如 Y1 两次取值 1.55)。
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,否则取值为 0。这样,我就可以知道 1:1 映射失败的地方。通过重新编码 NA,我可能会对此有所了解,但是当 id2 == 200 时抛出的错误呢?它只是丢弃信息。
我试过按行追加,但没有运气,看起来我也应该放弃合并,也许最好用一个循环或函数来做一些事情:
对于 x 中的每个观察
id2 = which(id2) 对应 id-month-year
如果上面的长度== 1,则标志 = 1,否则为 0
等等
希望这一切都有意义。我将非常感谢任何帮助或指导。