【发布时间】:2016-05-21 19:43:42
【问题描述】:
unique() 删除向量的重复元素和数组的重复行。
is.element()、%in% 和 match() 仅适用于向量(或 NULL)。
是否有多个变量的值匹配或设置操作?(例如数组的行)
我目前的解决方法是这样的。不是很优雅,显然对“_”匹配很敏感。
match.multiple <- function (x, table, nomatch = NA_integer_, incomparables = NULL) {
x_vector <- apply(x, 1, paste, collapse="_")
table_vector <- apply(table, 1, paste, collapse="_")
match(x_vector, table_vector, nomatch, incomparables)}
is.element.multiple <- "%in.multiple%" <- function (el, set) match.multiple(el, set, 0) > 0
编辑:添加可重现的示例
假设您希望购买具有相同数量的前进档和化油器的汽车。可以是 1 辆、2 辆等。您不知道市场上可用的汽车(参见mtcars)是否符合您的偏好.
preferences <- cbind(1:8, 1:8)
available <- cbind(mtcars$gear, mtcars$carb)
所以你对两个变量进行匹配:齿轮和化油器。
m <- match.multiple(preferences, available)
m
# [1] NA NA 12 1 NA NA NA NA
which(!is.na(m))
# [1] 3 4
这些是相同数量的前进档和化油器的数量。
willbuy <- m[!is.na(m)]
mtcars[willbuy, ]
# mpg cyl disp hp drat wt qsec vs am gear carb
# 1: 16.4 8 275.8 180 3.07 4.07 17.40 0 0 3 3
# 2: 21.0 6 160.0 110 3.90 2.62 16.46 0 1 4 4
这些是您应该考虑的汽车目录条目。
【问题讨论】:
-
@dww 这不是一回事:它会在
rbind(c("A", "B"), c("C", "D"))中找到c("A", "C")的匹配项 -
好的,我误解了这个问题。以为您想在多个对象中找到一项。似乎您还想测试列表是否作为数组或列表列表中的子集出现。是否可以编辑问题以使其更明显?
-
@dww 我不想在我的问题中包含列表——它只会让它变得更复杂。但我确实想说清楚。 我希望将一个矩阵的行与另一个矩阵的行进行匹配。
-
你的问题让我想起了 this question,我在 10 个月前用一个疯狂的 Rcpp 解决方案回答了这个问题。只是一种可能。
-
具有所需输出的可重现示例将很有帮助stackoverflow.com/questions/5963269/…
标签: r