R
中的值匹配函数非常有用。但据我理解,它不足以支持两个或高维输入。
例如,假设x
和y
是具有相同列数的矩阵,并且我想将x
的行与y
的行匹配。 'R'函数调用match(x,y)
不能实现此目的。同样的不足也会出现在列表输入中。
我已经实现了自己的版本,称为matchMat(xMat, yMat)
(如下所示),但我想知道你对这个任务的解决方案。
matchMat = function(xMat, uMat, dimn=1) {
ind = rep(-1, dim(xMat)[dimn])
id = 1 : dim(uMat)[dimn]
for (i in id) {
e = utilSubMat(i, uMat, dimn)
isMatch = matchVect(e, xMat, dimn)
ind[isMatch] = i
}
return(ind)
}
matchVect = function(v, xMat, dimn) {
apply(xMat, dimn, function(e) {
tf = e == v
all(tf)
})
}
unittest_matchMat = function() {
dimn = 1
uMat = matrix(c(1, 2, 2, 3, 3, 4, 4, 5), ncol=2, byrow=T)
ind = sample(dim(uMat)[1], 10, replace=T)
print(ind)
xMat = uMat[ind, ]
rst = matchMat(xMat, uMat, dimn)
print(rst)
stopifnot(all(ind == rst))
xMat2 = rbind(c(999, 999), xMat, c(888, 888))
rst2 = matchMat(xMat2, uMat, dimn)
print(rst2)
stopifnot(all(c(-1, ind, -1) == rst2))
print('pass!')
}
A <- data.frame(x = 1:6, y = 2:7)
,B <- data.frame(x = 1:8, y = c(2:8, 10))
,match(data.frame(t(A)), data.frame(t(B)))
。它只输出[1] NA NA NA NA NA NA
。 - Liang Zhangclass(c(2:7))
返回[1] "integer"
,而class(c(2:8, 10))
返回[1] "numeric"
。如果列表中不包含相同类型的数据,则它们不相同,但这证明了这种解决方案不方便使用。 - Jean Paul