Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 有条件重新启动时的行增量计数_R_Dataframe - Fatal编程技术网

R 有条件重新启动时的行增量计数

R 有条件重新启动时的行增量计数,r,dataframe,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")) 我猜R中有一些函数给出了一个通用的解决方案。有人能给我指出正确的方向吗?使用base R: df$x3 <- with(df, av

我想增加一个计数,当满足现有列中的条件时,该计数从1重新开始

例如,我有以下数据框:

df <- data.frame(x1 = c(10, 100, 200, 300, 87, 90, 45, 80), 
                 x2 = c("start", "a", "b", "c", "start", "k", "l", "o"))
我猜R中有一些函数给出了一个通用的解决方案。有人能给我指出正确的方向吗?

使用base R:

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

或者使用
dplyr
数据。表
包:

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')][]

下面是另一个基本的R方法:

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

sequence
获取一个整数向量,并将计数从1返回到每个向量项。使用
diff
计算每个序列开始位置的差值,将每个计数的长度馈送给它。因此,我们必须包括data.frame最后一行之后的位置值,
nrow(df)+1

我用base R的解决方案与您的非常相似。所以这里有另一个变体:
ave(1:nrow(df),cumsum(df$x2==“start”),FUN=rank)
如果我想要x2中的结束,您将如何修改代码。e、 g.结束=4,k=1而不是开始=1@JervisChionh看看你的问题。
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')][]
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