根据r中特定行上方和下方的值使用值构建新列

根据r中特定行上方和下方的值使用值构建新列,r,R,考虑任何长格式的数据帧(每行是一个测量点) col1表示参与者(这里只有两个人,A和B)。col2用1表示在该测量点发生了事件(即,它表示状态变化,例如从单身变为已婚) 现在,我想创建一个变量,该变量对于事件之前的所有测量点为0,对于事件发生的测量点为1,对于所有后续测量点也为1 col1 col2 col3 row.name11 A 0 0 row.name12 A 0 0 row.name13 A 1

考虑任何长格式的数据帧(每行是一个测量点)

col1表示参与者(这里只有两个人,A和B)。col2用1表示在该测量点发生了事件(即,它表示状态变化,例如从单身变为已婚)

现在,我想创建一个变量,该变量对于事件之前的所有测量点为0,对于事件发生的测量点为1,对于所有后续测量点也为1

             col1   col2  col3
row.name11    A     0     0 
row.name12    A     0     0
row.name13    A     1     1 
row.name14    A     0     1
row.name15    A     0     1
row.name16    B     0     0 
row.name17    B     0     0
row.name18    B     1     1

你有什么建议吗?非常感谢

您正在为每组寻找
cumsum
;下面是一个使用
ave

transform(df, col3 = ave(col2, col1, FUN = cumsum))
#           col1 col2 col3
#row.name11    A    0    0
#row.name12    A    1    1
#row.name13    A    0    1
#row.name14    A    0    1
#row.name15    B    0    0
#row.name16    B    0    0
#row.name17    B    1    1
dplyr
方式

library(dplyr)
df %>% group_by(col2) %>% mutate(col3 = cumsum(col2))

样本数据
df
数据。表
解决方案

df[, cummax(col2), by = col1]
其中:

df <- data.frame(
  col1 = c("A", "A", "A", "A", "B", "B", "B"), 
  col2 = c(0L, 1L, 0L, 0L, 0L, 0L, 1L)
)

df我还有一个问题与此相关。你介意再帮我一次吗@玛丽。不客气。总是考虑通过在答案旁边设置绿色检查来结束问题。我还发布了你新问题的答案。请看一看。
df[, cummax(col2), by = col1]
df <- data.frame(
  col1 = c("A", "A", "A", "A", "B", "B", "B"), 
  col2 = c(0L, 1L, 0L, 0L, 0L, 0L, 1L)
)