R 如何定义指标?
有一个名为PERNO的组,每个组如果在第i行col2==a中,我想为第i+1行定义一个指示符,该指示符为1,直到它再次到达a为止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 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))