使用条件重新启动增加对行的计数

时间:2017-02-28 19:58:40

标签: r dataframe

我希望在满足现有列中的条件时递增从1重新开始的计数。

例如,我有以下数据框:

df <- data.frame(x1 = c(10, 100, 200, 300, 87, 90, 45, 80), 
                 x2 = c("start", "a", "b", "c", "start", "k", "l", "o"))

我想创建x3,每次从x2 == "start"开始计数。

结果数据框应如下所示:

   x1    x2 x3
1  10 start  1
2 100     a  2
3 200     b  3
4 300     c  4
5  87 start  1
6  90     k  2
7  45     l  3
8  80     o  4

我猜测R中有现有的功能可以提供一般解决方案。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:7)

使用基数R:

df$x3 <- with(df, ave(x1, cumsum(x2 == 'start'), FUN = seq_along))

给出:

> df
   x1    x2 x3
1  10 start  1
2 100     a  2
3 200     b  3
4 300     c  4
5  87 start  1
6  90     k  2
7  45     l  3
8  80     o  4

或使用dplyrdata.table个套餐:

library(dplyr)
df %>% 
  group_by(grp = cumsum(x2 == 'start')) %>% 
  mutate(x3 = row_number())

library(data.table)
# option 1
setDT(df)[, x3 := rowid(cumsum(x2 == 'start'))][]
# option 2
setDT(df)[, x3 := 1:.N, by = cumsum(x2 == 'start')][]

答案 1 :(得分:4)

这是另一个基本R方法:

df$x3 <- sequence(diff(c(which(df$x2 == "start"), nrow(df)+1)))

返回

df
   x1    x2 x3
1  10 start  1
2 100     a  2
3 200     b  3
4 300     c  4
5  87 start  1
6  90     k  2
7  45     l  3
8  80     o  4

sequence采用整数向量,并将计数从1返回到每个向量条目。使用diff来计算每个计数的长度,以计算每个序列开始位置的差异。因此,我们必须在data.frame的最后一行nrow(df)+1之后包含该位置的值。