我有兴趣编写一个程序,该程序给出向量x
的元素数量,它们小于或等于向量x
中的任何给定值。
让我们说
x = [1,3,8,7,6,4,3,10,12]
我想计算x
中小于或等于1,到3,到8等的元素数量。例如,x[5]
的第五个元素是6
,小于或等于6
的元素数等于5
。但是,我只知道如何进行元素比较,例如x[1]<=x[3]
我想我会使用for循环并在这里有这样的东西:
for (i in length(x)){
if (x[i]<=x[i]){
print(x[i])}
# count number of TRUEs
}
然而,这段代码显然没有做我想要的。
答案 0 :(得分:5)
使用outer
一次进行所有比较:
outer(x, x, "<=")
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
# [1,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# [2,] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# [3,] FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE TRUE
# [4,] FALSE FALSE TRUE TRUE FALSE FALSE FALSE TRUE TRUE
# [5,] FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE TRUE
# [6,] FALSE FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE
# [7,] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# [8,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
# [9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
colSums(outer(x, x, "<="))
#[1] 1 3 7 6 5 4 3 8 9
答案 1 :(得分:3)
您还可以使用*apply
系列,如下所示,
sapply(x, function(i) sum(x <= i))
#[1] 1 3 7 6 5 4 3 8 9
答案 2 :(得分:3)
我们可以使用findInterval
findInterval(x, sort(x))
#[1] 1 3 7 6 5 4 3 8 9
答案 3 :(得分:3)
另一种选择是使用rank
,对值进行排名。将ties.method参数设置为&#34; max&#34;检索包含值(&#34;&lt; =&#34;与&#34;&lt;&#34;)。
rank(x, ties.method="max")
[1] 1 3 7 6 5 4 3 8 9