我正在尝试将两个数据集连接在一起。称他们为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的位置,并标记那些没有的id。所以我会得到一个新的向量,称之为标志,如果x $ id在y $ id2中匹配则取值为1,否则为零。这样,我就可以知道1:1映射失败的位置。我可以通过重新编码NA来获得一些关注,但是当id2 == 200时会抛出的错误呢?它只是丢弃了这些信息。
我尝试过没有运气的行追加,看起来我也应该放弃合并,也许最好拧一个循环或函数来做这些事情:
对于x
中的每个观察id2 =哪个(id2)对应于id-month-year
如果上面的长度是== 1,则flag = 1,否则为
等。
希望这一切都有道理。我非常感谢任何帮助或指导。
答案 0 :(得分:0)
如果您正在寻找x$id
中y$id2
中的哪些内容,那么您可以使用
x$id %in% y$id2
获取返回匹配的逻辑向量。但是,它并不保证一对一的对应关系;只是一对多。然后,您可以将此向量添加到数据框
x$match.y <- x$id %in% y$id2
查看x
中哪些y
行具有相应的ID。
要查看哪些观察结果为1对1,您可以执行类似
的操作y$id2[duplicated(y$id2)] #vector of duplicate elements in y$id2
(x$id %in% y$id2) & !(x$id %in% y$id2[duplicated(y$id2)])
过滤掉y$id2
中出现多次的元素。您也可以将其添加到x
:
x$match.y.unique <- (x$id %in% y$id2) & !(x$id %in% y$id2[duplicated(y$id2)])
可以对y
执行相同的过程,以确定y
中x
的哪些行匹配,以及哪些行匹配唯一。
答案 1 :(得分:0)
您的合并失败的原因是您为x和y提供了两种不同的结构(一种是数字矩阵,另一种是字符矩阵)。在选择cbind
时使用data.frame
是失败的常见策略。
> str(x)
chr [1:110, 1:4] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "1" "2" ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:4] "id" "X1" "month" "year"
> str(y)
num [1:11, 1:2] 1 2 3 4 5 6 7 8 9 10 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "id2" "Y1"
如果你使用了data.frame
函数(因为数据帧是merge
应该使用的那个),它就会成功:
> x <- data.frame(id, X1, month, year); y <- data.frame(id2,Y1)
> str( result <- merge(x, y, by.x="id", by.y = "id2", all =TRUE) )
'data.frame': 111 obs. of 5 variables:
$ id : num 1 1 2 2 3 3 4 4 5 5 ...
$ X1 : num 1.5063 2.5035 0.7889 -0.4907 -0.0446 ...
$ month: Factor w/ 10 levels "Apr","Aug","Dec",..: 6 6 2 2 10 10 9 9 8 8 ...
$ year : Factor w/ 5 levels "2001","2002",..: 3 3 4 4 5 5 1 1 2 2 ...
$ Y1 : num 1.449 1.449 -0.134 -0.134 -0.828 ...
> tail( result <- merge(x, y, by.x="id", by.y = "id2", all =TRUE) )
id X1 month year Y1
106 96 -0.3869157 Dec 2004 NA
107 97 0.6373009 Jan 2005 NA
108 98 -0.7735626 Feb 2006 NA
109 99 -1.3537915 Mar 2001 NA
110 100 0.2626190 Apr 2002 NA
111 200 NA <NA> <NA> -1.509818
如果你的'x'参数中有重复项,那么你应该在结果中获得重复项。然后,您有责任以您认为合适的任何方式(在合并之前或之后)使用!duplicated
,但您不能指望merge
为您做出类似的决定。