R 如何定义指标?

R 如何定义指标?,r,dataframe,R,Dataframe,有一个名为PERNO的组,每个组如果在第i行col2==a中,我想为第i+1行定义一个指示符,该指示符为1,直到它再次到达a为止 PERNO col2 col3 1 b 3 1 d 3 1 a 4 1 d 5 2 v 2

有一个名为PERNO的组,每个组如果在第i行col2==a中,我想为第i+1行定义一个指示符,该指示符为1,直到它再次到达a为止

      PERNO     col2      col3
        1         b         3
        1         d         3
        1         a         4
        1         d         5
        2         v         2
        2         a         3
        2         a         4
        2         x         4
        2         h         5
输出

      PERNO     col2      col3     indicator
        1         b         3          0 
        1         d         3          0
        1         a         4          0
        1         d         5          1
        2         v         2          0
        2         a         3          0
        2         a         4          0
        2         x         4          1
        2         h         5          1
在第一组中,第四行是1,因为它紧挨着col2==a的行

在第二组中,最后两行也是一行,我们可以将行数与最后一个索引进行比较,每组中的col2==a

ave(d$col2 != "a", d$PERNO, FUN = function(x){
    with(rle(x), rep(replace(values, 1, 0), lengths))
})
#[1] 0 0 0 1 0 0 0 1 1
library(dplyr)
df %>%
  group_by(PERNO) %>%
  mutate(indicator = as.integer(row_number() > max(which(col2 == "a"))))

#  PERNO col2   col3 indicator
#  <int> <fct> <int>     <int>
#1     1 b         3         0
#2     1 d         3         0
#3     1 a         4         0
#4     1 d         5         1
#5     2 v         2         0
#6     2 a         3         0
#7     2 a         4         0
#8     2 x         4         1
#9     2 h         5         1
和数据表

我们可以将行数与每组中col2==a的最后一个索引进行比较

library(dplyr)
df %>%
  group_by(PERNO) %>%
  mutate(indicator = as.integer(row_number() > max(which(col2 == "a"))))

#  PERNO col2   col3 indicator
#  <int> <fct> <int>     <int>
#1     1 b         3         0
#2     1 d         3         0
#3     1 a         4         0
#4     1 d         5         1
#5     2 v         2         0
#6     2 a         3         0
#7     2 a         4         0
#8     2 x         4         1
#9     2 h         5         1
和数据表


我认为这一尝试应该奏效:

ave(dat$col2=="a", dat$PERNO, FUN=function(x) cummax(x) & (!x) )
#[1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE

ave(dat$col2=="a", dat$PERNO, FUN=function(x) cummax(x) & (!x) ) + 0
#[1] 0 0 0 1 0 0 0 1 1
在data.table中,类似于:

dat[, ind := cummax(col2=="a") & col2 != "a", by=PERNO]

逻辑基本上是,指标应保持为0,直到找到a,此时累积最大值增加到1,并将保持为1,直到组结束。a的任何进一步运行都会导致指示器设置回0,因此需要使用col2排除这些值!=a或!x、

我认为这一尝试应该奏效:

ave(dat$col2=="a", dat$PERNO, FUN=function(x) cummax(x) & (!x) )
#[1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE

ave(dat$col2=="a", dat$PERNO, FUN=function(x) cummax(x) & (!x) ) + 0
#[1] 0 0 0 1 0 0 0 1 1
在data.table中,类似于:

dat[, ind := cummax(col2=="a") & col2 != "a", by=PERNO]
逻辑基本上是,指标应保持为0,直到找到a,此时累积最大值增加到1,并将保持为1,直到组结束。a的任何进一步运行都会导致指示器设置回0,因此需要使用col2排除这些值!=a或!x、

我们可以用带尾巴的

或者使用data.table

数据 我们可以用尾巴

或者使用data.table

数据
当2个a在2个重复行中相互跟随,第二个a得到1,我们可以修改您的代码吗?在第二个目的中也是一样,在我的例子中,我们可以修改你的代码,当两个a在两个重复的行中互相跟随,第二个得到1?同样在第二个目的中,在我的例子中,我们也可以修改你的代码,当两个a在两个重复的行中互相跟随,第二个得到1?我的第二个目的也是一样的exampl@hghg您可以将max替换为min,df%>%group\u byPERNO%>%mutateindicator=as.integerrow\u number>minwhichcol2==a我们还可以修改您的代码,以便在2个重复行中2个a相互跟随,第二个得到1?我的第二个目的也是一样的exampl@hghg您可以将max替换为min,df%>%group\u byPERNO%>%mutateindicator=as.integerrow\u number>minwhichcol2==a如果2个重复行中的2个a互相跟随,第二个得到1,我们可以修改代码吗?在第二个目的中也是一样,在我的例子中,我们可以修改你的代码,当两个a在两个重复的行中互相跟随,第二个得到1?我的例子中的第二个目的也是一样的
df1$indicator <- with(df1, ave(col2 == "a", PERNO, FUN = function(x)
                seq_along(x) > tail(which(x== "a'), 1)))
library(data.table)
setDT(df1)[, indicator := +(seq_len(.N) > tail(which(col2 == "a"), 1)), PERNO]
df1 <- structure(list(PERNO = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), 
    col2 = c("b", "d", "a", "d", "v", "a", "a", "x", "h"), col3 = c(3L, 
    3L, 4L, 5L, 2L, 3L, 4L, 4L, 5L)), class = "data.frame", row.names = c(NA, 
-9L))