说我有以下向量:
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中进行此计算的方法,因此我可以在更大的集合上使用它。
答案 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')