创建一个向量,其值具有另一个向量中不同值的计数

时间:2017-12-20 20:36:19

标签: r vector counter

说我有以下向量:

dat <- c(1,0,-1,1,0,-1,1,0,1)

我想要一个向量来计算在数据中出现的1,0和-1,但是作为一个正在进行的计数。解决方案看起来像这样:

tally <- c(1,1,1,2,2,2,3,3,4)

所以基本上我的新矢量从dat开始持续计数为1,0和-1。我正在寻找一种在R中进行此计算的方法,因此我可以在更大的集合上使用它。

2 个答案:

答案 0 :(得分:1)

这是一个相当简单的方法:

> dat <- c(1,0,-1,1,0,-1,1,0,1)
> tally <- ave(dat, factor(dat), FUN=seq_along)
> tally
[1] 1 1 1 2 2 2 3 3 4

ave函数将dat向量除以dat中的唯一值(在本例中为-1,0和1),然后seq_along为快速而又脏的方法来获取每个唯一值的运行记录,然后ave将单独的累积计数重新排列在一起以匹配原始数据。

答案 1 :(得分:1)

dat <- c(1,0,-1,1,0,-1,1,0,1)

new_vec <- NULL
count_this <- function(vec) {
    for(i in 1:length(vec)) {
    this_elem = vec[i]
    before_vec <- vec[1:i]
    contains_vec <- before_vec[before_vec == this_elem]
    new_vec[i] <- length(contains_vec)
    }
    return(new_vec)
}

像这样使用:

count_this(dat)

1 1 1 2 2 2 3 3 4

但绝对使用Greg更有效的方法:

dat_long <- round(rnorm(10000), 0)

start.time <- Sys.time()
res_a <- count_this(dat_long)
end.time <- Sys.time()
time.taken <- end.time - start.time
p_1 <- as.vector(time.taken)

start.time <- Sys.time()
res_b <- ave(dat_long, factor(dat_long), FUN=seq_along)
end.time <- Sys.time()
time.taken <- end.time - start.time
p_2 <- as.vector(time.taken)

final <- data.frame(For_Loop = p_1, Vectorized = p_2)
mp <- barplot(as.matrix(final), col='steelblue', beside=T, main='Runtimes for Tally Algoritm')

enter image description here