我的功能哪里出问题了
我正在尝试创建一个函数,该函数将计算向量中的所有唯一对,说我有以下输入:
ar <- c(10, 20, 20, 30, 30, 30, 40, 50)
唯一对的数量为20 = 1
,30 = 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版本,但也对软件包版本感兴趣。
答案 0 :(得分:3)
这是使用floor
和table
形式的基本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