考虑长格式的任何数据帧(每一行是一个测量点)
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
您对如何执行此操作有意见吗?非常感谢!
答案 0 :(得分:0)
您正在寻找每组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 <- 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)
)