计算R中的序列

时间:2015-09-25 18:29:08

标签: r count sequences

id  random  count
a   0        -1
a   1         1
a   1         2
a   0        -1
a   0        -2
a   1         1
a   0        -1
a   1         1
a   0        -1
b   0        -1
b   0        -2
b   1         1
b   0        -1
b   1         1
b   0        -1
b   0        -2
b   0        -3

id是播放器,random是二进制01,我想创建一个计数列,用于计算1&0 39和0的序列#39;播放器,最好没有循环,因为数据库非常大。

3 个答案:

答案 0 :(得分:5)

我认为这是你正在寻找的东西:

library(data.table)
setDT(DF)[, count := seq_len(.N), by=.(id,rleid(random))]

给出了

    id random count
 1:  a      0     1
 2:  a      1     1
 3:  a      1     2
 4:  a      0     1
 5:  a      0     2
 6:  a      1     1
 7:  a      0     1
 8:  a      1     1
 9:  a      0     1
10:  b      0     2
11:  b      0     3
12:  b      1     1
13:  b      0     1
14:  b      1     1
15:  b      0     1
16:  b      0     2
17:  b      0     3

(在data.table软件包的下一个版本1.9.8中,会有一个小快捷方式setDT(DF)[, count := rowid(rleid(random)), by=id]。我正在编写此笔记,以便稍后更新答案。)

您可能还需要运行组的标识符:

DF[, rid := rleid(random), by=id]

给出了

    id random count rid
 1:  a      0     1   1
 2:  a      1     1   2
 3:  a      1     2   2
 4:  a      0     1   3
 5:  a      0     2   3
 6:  a      1     1   4
 7:  a      0     1   5
 8:  a      1     1   6
 9:  a      0     1   7
10:  b      0     1   1
11:  b      0     2   1
12:  b      1     1   2
13:  b      0     1   3
14:  b      1     1   4
15:  b      0     1   5
16:  b      0     2   5
17:  b      0     3   5

如果您通读introductory materials on the package,您会发现这些变量也可以一步创建。

答案 1 :(得分:3)

这是dplyr解决方案

dat %>%
  transform(idx = c(0,cumsum(random[-1L] != random[-length(random)]))) %>%
  group_by(id, idx) %>%
  mutate(count = -1*cumsum(random == 0) + cumsum(random == 1)) %>%
  ungroup() %>%
  select(-idx)

Source: local data frame [17 x 3]

   id random count
1   a      0    -1
2   a      1     1
3   a      1     2
4   a      0    -1
5   a      0    -2
6   a      1     1
7   a      0    -1
8   a      1     1
9   a      0    -1
10  b      0    -1
11  b      0    -2
12  b      1     1
13  b      0    -1
14  b      1     1
15  b      0    -1
16  b      0    -2
17  b      0    -3

答案 2 :(得分:0)

我认为最简单的方法是使用runner包中的HttpClient函数。 Dim refreshRange As Range Set refreshRange = Range("'Courses Date'!E1:BF1").Find(Range("'Matrix'!" & courseColLetter & "1").Value & " Refresher") If Not refreshRange Is Nothing Then RefresherColNumber = refreshRange.Column 最快,如下节所示

解决方案

streak_run

基准

streak_run