我们假设我们有一个向量local[*]
,我想要一个函数来返回每个值的重复次数。我想得到的结果是a <- c(1,2,3,4,1,5,6,1,7)
- 因为数字1重复了3次。
第二个问题 - 如何获得一个函数,它会返回c(1,1,1,1,2,1,1,3,1)
以上的值?所以它只计算重复的元素而其他所有元素都会得到0?
谢谢!
答案 0 :(得分:5)
您可以使用ave
功能:
ave(rep(1, length(a)), a, FUN=cumsum)
# [1] 1 1 1 1 2 1 1 3 1
关注@ lmo的评论,第二部分:
alldups <- duplicated(a) | duplicated(a, fromLast = TRUE)
res <- ave(rep(1, length(a)), a, FUN=cumsum)
res[!alldups] <- 0
# [1] 1 0 0 0 2 0 0 3 0
答案 1 :(得分:0)
一个选项是
unsplit(lapply(split(a, a), function(x) cumsum(duplicated(x))+1),a)
或ave
res <- ave(a, a, FUN = function(x) cumsum(duplicated(x))+1)
res
#[1] 1 1 1 1 2 1 1 3 1
和第二部分
res[duplicated(res)] <- 0
res
#[1] 1 0 0 0 2 0 0 3 0
答案 2 :(得分:0)
另一个选项是sapply
temp <- sapply(1:length(a),function(x) sum(a[1:x] == a[x]))
temp
#[1] 1 1 1 1 2 1 1 3 1
And for the second one:
temp[duplicated(temp)] <- 0