【问题标题】:Indexing vectors in r languager语言中的索引向量
【发布时间】:2018-05-23 20:33:02
【问题描述】:

我需要以特定方式索引一个向量

例如我有以下向量:

x = c(1,1,2,3,1,1,2,3)

函数的输出必须返回一个像这样的向量

[1,1,2,3,4,4,5,6]

如果一个数字在向量x 中重复,则输出向量必须将索引作为相同的数字处理

函数必须只考虑连续重复的数字

这是我尝试做的事情

svector <- function(x){

y = c()

for (i in 1:NROW(x)){

if((x[-length(x)] == x[-1])){

y[i] = y[i+1] 

}else{

next

}
 } 
  }

在我的程序中,我尝试读取向量中的第一个和第二个条目,比较是否相同,然后在一个空向量y 中插入条目

【问题讨论】:

  • 如果x = c(1,1,2,3,1,1,2,3),输出应该是什么?
  • @MelissaKey 把它写成答案?
  • @CPak [1,1,2,3,4,4,5,6] 它只记录重复的连续数字
  • @blazedosan002 好的 - 投票最高的评论会给出错误的答案 - 你能更新你的帖子以添加第二个场景吗?
  • @CPak 我更新了帖子

标签: r vector indexing


【解决方案1】:

当所有具有相同值的条目需要具有相同的索引时,我们会使用

as.numeric(factor(x, levels = unique(x)))

这假定@CPak 提到的各种非连续重复被忽略。当索引应该不同时,以下工作:

library(dplyr) # for lag function
cumsum(x != lag(x, default = 0))

cumsum(x != c(0, x[-length(x)]))

避免lag函数

【讨论】:

    【解决方案2】:

    data.table 包中的rleid 函数正是为此目的。应该快很多倍。

    x <- sample(1:5e4, 1e6, T)
    
    all.equal(rleid(x), cumsum(x != lag(x, default = 0)))
    # TRUE
    
    library(microbenchmark)
    microbenchmark(custom = cumsum(x != lag(x, default = 0)), 
                   rleid = rleid(x), unit = 'relative')
    
    # Unit: relative
    #    expr      min      lq     mean   median       uq      max neval
    #  custom 5.481059 6.52852 4.660912 6.816693 5.586913 1.550265   100
    #   rleid 1.000000 1.00000 1.000000 1.000000 1.000000 1.000000   100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      相关资源
      最近更新 更多