向量中的唯一对或组合

时间:2019-08-29 17:57:18

标签: r

我的功能哪里出问题了

我正在尝试创建一个函数,该函数将计算向量中的所有唯一对,说我有以下输入:

ar <- c(10, 20, 20, 30, 30, 30, 40, 50)

唯一对的数量为20 = 130 = 1,所以我可以将它们加起来,唯一对的总数为2

无论如何,我试图将30创建为具有2个唯一对(因为30在向量中出现3次。

n <- 9
ar <- c(10, 20, 20, 30, 30, 30, 40, 50)

CountThePairs <- function(n, ar){
  for(i in 1:length(ar)){
    sum = ar[i] - ar[]
    pairs = length(which(sum == 0))
  }
  return(sum)
}

CountThePairs(n = NULL, ar)

有没有更简单的方法?我更喜欢基本的R版本,但也对软件包版本感兴趣。

2 个答案:

答案 0 :(得分:3)

这是使用floortable形式的基本R的更简单方法-

ar <- c(10, 20, 20, 30, 30, 30, 40, 50)

sum(floor(table(ar)/2))

[1] 2

示例2 -向向量中再添加一个30,因此现在有2对30-

ar <- c(10, 20, 20, 30, 30, 30, 30, 40, 50)

sum(floor(table(ar)/2))

[1] 3

如果2对30对算作一对“唯一”对,则@tmfmnk的原始解决方案是正确的-

sum(table(ar) >= 2)

答案 1 :(得分:1)

如果向量的唯一值重复,则可以使用sapply返回逻辑向量。那么该逻辑值的总和就是唯一对的数量。

ar <- c(10, 20, 20, 30, 30, 30, 40, 50)

is_pair <- sapply(unique(ar), function(x) length(ar[ar == x]) > 1)
sum(is_pair)
#[1] 2

我不确定如果有四个30时您想要什么行为-这是否仍算作一对唯一对,还是现在是两个?如果是后者,则需要稍微不同的解决方案:

n_pair <- sapply(unique(ar), function(x) length(ar[ar == x]) %/% 2)
sum(n_pair)
#[1] 2