首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >累计计算一次情况连续发生了多少次

累计计算一次情况连续发生了多少次
EN

Stack Overflow用户
提问于 2017-03-30 10:37:35
回答 2查看 38关注 0票数 0

data.table (或data.frame)中,如何计算连续发生这种情况的“累计”次数?

为了说明,

代码语言:javascript
复制
DT <- data.table(A=c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
                 B=c(1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1))

如果我想添加一个列C,它指示

  • 如果(A==B),将1添加到当前行的值中。
  • 如果(A!=B),用0重新开始

所以答案是

代码语言:javascript
复制
DT <- data.table(A=c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
                 B=c(1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1),
                 C=c(1, 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4, 0, 1)]

这似乎很简单,但我似乎做不到。我猜它可以建立在这样的基础上?

代码语言:javascript
复制
DT[,C:=ifelse(A==B, ??, 0)]

而且,恐怕这是一个重复的问题,但找不到它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-30 10:39:39

我们可以使用rleid在'B‘上创建一个分组变量,然后用'B’乘行序列以创建'C‘。

代码语言:javascript
复制
DT[, C := seq_len(.N)*B, .(A, rleid(B))]
DT
#    A B C
# 1: 1 1 1
# 2: 1 0 0
# 3: 1 1 1
# 4: 1 1 2
# 5: 1 0 0
# 6: 1 1 1
# 7: 1 1 2
# 8: 1 1 3
# 9: 1 0 0
#10: 1 1 1
#11: 1 1 2
#12: 1 1 3
#13: 1 1 4
#14: 1 0 0
#15: 1 1 1
票数 1
EN

Stack Overflow用户

发布于 2017-03-30 12:19:42

ave R中使用base

代码语言:javascript
复制
x <- with(dt, A==B)
cbind(dt, C = ave(x, cumsum(x == 0), FUN = cumsum))

   # A B C
 # 1: 1 1 1
 # 2: 1 0 0
 # 3: 1 1 1
 # 4: 1 1 2
 # 5: 1 0 0
 # 6: 1 1 1
 # 7: 1 1 2
 # 8: 1 1 3
 # 9: 1 0 0
# 10: 1 1 1
# 11: 1 1 2
# 12: 1 1 3
# 13: 1 1 4
# 14: 1 0 0
# 15: 1 1 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43115404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档