【问题标题】:elements in array or vector数组或向量中的元素
【发布时间】:2017-12-30 08:22:57
【问题描述】:

我有一个包含重复值的向量:

v=“3,600”“3,600”“3,600”“3,600”“3,600”“3,600”“3,600”“3,600”“3,400”“3,400”“3,400”“3,600”“3,600”“3,600”

什么是找到我拥有哪个元素的正确方法,有多少相同以及它们在哪里? 我想要这样的输出:

var1:"3,600" rep : 11 position: 1:8, 12:14
var2:"3,400" rep : 3  position: 9:11

【问题讨论】:

  • 这个问题有点笼统。 table 将为您提供计数和级别。 sapply(unique(v), function(x) which(x == v)) 将获得职位。

标签: arrays r select vector


【解决方案1】:

我们可以使用split

lst <- split(seq_along(v), v)
lengths(lst)
#   3,400 3,600 
#    3    11 

如果我们需要 OP 帖子中显示的输出

library(data.table)
data.table(v, i = seq_along(v))[, .(var = v[1], rep = .N,
  position = paste(i[1], i[.N], sep=":")) , .(rleid(v))
     ][, .(rep=sum(rep), position = toString(position)), var]
#     var rep   position
#1: 3,600  11 1:8, 12:14
#2: 3,400   3       9:11

数据

v <- c("3,600", "3,600", "3,600", "3,600", "3,600", "3,600", "3,600", 
 "3,600", "3,400", "3,400", "3,400", "3,600", "3,600", "3,600"
)

【讨论】:

    【解决方案2】:
    sapply(unique(v), function(x){
        temp = which((x == v))
        data.frame(variable = x,
                rep = sum(x == v),
                position = paste(sapply(split(temp ,cumsum(c(1, diff(temp)!=1))), function(y)
                    paste(range(y), collapse = ":")), collapse = ", "),
                stringsAsFactors = FALSE)
        })
    #         3,600        3,400  
    #variable "3,600"      "3,400"
    #rep      11           3      
    #position "1:8, 12:14" "9:11" 
    

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 2017-03-06
      • 1970-01-01
      • 2017-12-01
      • 2022-01-14
      相关资源
      最近更新 更多