统计某个值在r中出现的次数
Counting number of appeareances of a certain value in r
假设我们有一个向量 a <- c(1,2,3,4,1,5,6,1,7)
,我想要一个函数 return 每个值的重复次数。我想要得到的结果是 c(1,1,1,1,2,1,1,3,1)
- 因为数字 1 被重复了 3 次。
第二个问题 - 如何获得一个函数 return c(1,0,0,0,2,0,0,3,0)
上面的值?所以它只会计算重复的元素,所有其他元素都会得到 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
另一种选择是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
您可以使用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
假设我们有一个向量 a <- c(1,2,3,4,1,5,6,1,7)
,我想要一个函数 return 每个值的重复次数。我想要得到的结果是 c(1,1,1,1,2,1,1,3,1)
- 因为数字 1 被重复了 3 次。
第二个问题 - 如何获得一个函数 return c(1,0,0,0,2,0,0,3,0)
上面的值?所以它只会计算重复的元素,所有其他元素都会得到 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
另一种选择是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
您可以使用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