【问题标题】:how to rank values in a vector and give them corresponding values?如何对向量中的值进行排名并赋予它们相应的值?
【发布时间】:2010-12-09 17:59:44
【问题描述】:

现在我通过循环遍历排序向量来做到这一点,但也许有一种使用内部 R 函数的更快方法,也许我什至不需要排序。

vect = c(41,42,5,6,3,12,10,15,2,3,4,13,2,33,4,1,1)
vect = sort(vect)
print(vect)
outvect = mat.or.vec(length(vect),1)
outvect[1] = counter = 1
for(i in 2:length(vect)) {
    if (vect[i] != vect[i-1]) { counter = counter + 1 }
    outvect[i] = counter
}

    print(cbind(vect,outvect))

 vect outvect
 [1,]    1       1
 [2,]    1       1
 [3,]    2       2
 [4,]    2       2
 [5,]    3       3
 [6,]    3       3
 [7,]    4       4
 [8,]    4       4
 [9,]    5       5
[10,]    6       6
[11,]   10       7
[12,]   12       8
[13,]   13       9
[14,]   15      10
[15,]   33      11
[16,]   41      12
[17,]   42      13

代码用于在 X 轴上制作带有整数而不是真实数据的图表,因为对我来说 X 值之间的距离并不重要。 所以在我的例子中,最小的 x 值总是 1。最大的总是等于有多少个 X 值。

-- 编辑:由于对我的问题的一些误解,我在输出中添加了自给自足的代码。

【问题讨论】:

  • 这个问题不清楚,因为它目前的措辞。您的输入数据是什么样的 (csvdata)?最终产品应该是什么样子?您是否只是想获取 csvdata 中唯一值的列表?如果是这样,请查看table()
  • 我的数据是标记为 X 和 Y 的数字矩阵,但 csvdata 中只有一列对我来说很有趣,即 X,z 是一个新向量,其中包含来自 csvdata[,'X ']
  • 抱歉,我看不到 factor 是如何满足我的需要的
  • @user393087 - 我们在这里遇到的是通信失败。您无法用英语、代码或伪代码表达您想要做什么。这显然不是那么简单,因为你没有人真正了解你想要什么。也许退后一步,再次描述您的问题,提供示例输入和所需的输出。最后,关于您为什么要这样做的任何提示都会有所帮助,因为可能有更简单、更有效的替代方法,并且可以让您更有效地回答您的实际问题。
  • 我尝试做的事情我已经完成并粘贴了上面问题中的代码。我所问的是是否有一个内置函数可以做到这一点。我粘贴的这段代码有效!!我还在下面的帖子的评论中提供了输入和输出。而且我看不出所有这些负面情绪的原因。

标签: r vector


【解决方案1】:

那就更清楚了。因此:

> vect = c(41,42,5,6,3,12,10,15,2,3,4,13,2,33,4,1,1)
> cbind(vect,as.numeric(factor(vect)))
 [1,]   41 12
 [2,]   42 13
 [3,]    5  5
 [4,]    6  6
 [5,]    3  3
 [6,]   12  8
 [7,]   10  7
 [8,]   15 10
 [9,]    2  2
[10,]    3  3
[11,]    4  4
[12,]   13  9
[13,]    2  2
[14,]   33 11
[15,]    4  4
[16,]    1  1
[17,]    1  1

不需要排序。如前所述,另见?factor

如果你想保留订单,那么:

> cbind(vect,as.numeric(factor(vect,levels=unique(vect))))
      vect   
 [1,]   41  1
 [2,]   42  2
 [3,]    5  3
 [4,]    6  4
 [5,]    3  5
 [6,]   12  6
 [7,]   10  7
 [8,]   15  8
 [9,]    2  9
[10,]    3  5
[11,]    4 10
[12,]   13 11
[13,]    2  9
[14,]   33 12
[15,]    4 10
[16,]    1 13
[17,]    1 13

【讨论】:

  • 非常感谢,原来如此!
  • 仅供参考:取反向量以按最大到最小(降序)排列,例如cbind(v,as.numeric(factor(-v)))
【解决方案2】:

Joris 解决方案是正确的,但如果你有一个长向量,使用 match 和 unique 会更有效一点 (3x):

> x=sample(1e5, 1e6, replace=TRUE)
> # preserve order:
> system.time( a<-cbind(x, match(x, unique(x))) )
   user  system elapsed 
   0.20    0.00    0.22 
> system.time( b<-cbind(x, as.numeric(factor(x,levels=unique(x)))) )
   user  system elapsed 
   0.70    0.00    0.72 
> all.equal(a,b)
[1] TRUE
> 
> # sorted solution:
> system.time( a<-cbind(x, match(x, sort(unique(x)))) )
   user  system elapsed 
   0.25    0.00    0.25 
> system.time( b<-cbind(x, as.numeric(factor(x))) )
   user  system elapsed 
   0.72    0.00    0.72 
> all.equal(a,b)
[1] TRUE

【讨论】:

    【解决方案3】:

    你可以试试这个: (请注意,您可能希望重复值具有不同的行为。这将为每个值赋予唯一的排名)

    > x <- sample(size=10, replace=T, x=1:100)
    > x1 <- vector(length=length(x))
    > x1[order(x)] <- 1:length(x)
    > cbind(x, x1)
           x x1
     [1,] 40  1
     [2,] 46  4
     [3,] 43  3
     [4,] 41  2
     [5,] 47  5
     [6,] 84 10
     [7,] 75  8
     [8,] 60  7
     [9,] 59  6
    [10,] 80  9
    

    【讨论】:

      【解决方案4】:

      看起来您正在计算数据中的运行次数,如果是这种情况,请查看 rle 函数。

      【讨论】:

      • 不!你不能从提供的代码中看到,那太简单了,我应该在它旁边说任何话。如果你有向量 1,1,6,8,4,8 它给出 1,1,2,3,4,3
      • @user393087 -- 它如何给出 1、1、2、3、4、3?计数器如何减少?如果您给出最终目标而不是小步,您可能会得到更好的答案。有时有一种功能可以将所有婴儿步骤合二为一。
      • 在这里我必须为小小的误解道歉。在第一篇文章中,我询问了一个可能内置的函数,它能够在不进行排序的情况下进行输入和输出,这当然需要时间。我粘贴的代码无法做到这一点,必须对向量或矩阵进行排序。第二件事是我认为现在这个例子并没有说明我的想法。如果我犯了错误,我试图做到这一点。我将在一分钟内发布实际输出。
      【解决方案5】:

      您显然想要 table() 之类的结果,但在值旁边排列:尝试使用 ave() 函数:

      csvdata$counts <- ave(csvdata[, "X"], factor(csvdata[["X"]]), FUN=length)
      

      这里的诀窍是 ave 的语法与 tapply 有点不同,因为您放入了任意长的因子参数集,并且您需要在函数前面放入 FUN=,因为三点之后的参数是不按订单处理。他们需要被命名。

      【讨论】:

      • print(ave(vect, factor(vect), FUN=length)) - 给出:[1] 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 - 这是完成了我在(现在编辑)第一篇文章中提供的矢量。所以不是这样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 2021-07-03
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多