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

时间:2018-08-03 11:30:35

标签: r

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

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

col1表示参与者(这里只有2个人,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

您对如何执行此操作有意见吗?非常感谢!

2 个答案:

答案 0 :(得分:0)

您正在寻找每组cumsum;这是使用ave

的基本R解决方案
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 <- read.table(text =
    "            col1   col2
row.name11    A     0
row.name12    A     1
row.name13    A     0
row.name14    A     0
row.name15    B     0
row.name16    B     0
row.name17    B     1  ", header = T)

答案 1 :(得分:0)

data.table解决方案。

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)
)