【问题标题】:How many elements of a vector are smaller or equal to each element of this vector?一个向量有多少个元素小于或等于这个向量的每个元素?
【发布时间】:2018-02-01 21:41:57
【问题描述】:

我有兴趣编写一个程序,它给出向量 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
}

但是,这段代码显然不能满足我的要求。

【问题讨论】:

  • sapply() 有效,谢谢! i 是否直接表示x 的第 i 个元素?
  • 没错……

标签: r for-loop vector


【解决方案1】:

使用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

【讨论】:

  • 完美!您唯一需要考虑的是您正在考虑总和中的每个元素,因此根据您的兴趣,您必须从每个值中减去一个单位。
【解决方案2】:

你也可以使用*apply家族如下,

sapply(x, function(i) sum(x <= i))
#[1] 1 3 7 6 5 4 3 8 9

【讨论】:

    【解决方案3】:

    我们可以使用findInterval

    findInterval(x, sort(x))
    #[1] 1 3 7 6 5 4 3 8 9
    

    【讨论】:

      【解决方案4】:

      另一种选择是使用rank,它对值进行排名。将 ties.method 参数设置为“max”会检索包含值(“

      rank(x, ties.method="max")
      [1] 1 3 7 6 5 4 3 8 9
      

      【讨论】:

      • 这是最好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2014-05-21
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 2012-09-06
      • 1970-01-01
      相关资源
      最近更新 更多