使用上一行值突变Cumsum

时间:2016-01-13 20:13:50

标签: r dplyr

我正在尝试在两个单独的列上的数据框上运行cumsum。它们基本上是针对两个不同变量的事件列表。只有一个变量可以在数据帧中每行记录一个事件。我解决问题的方法是创建一个新变量,保持值为'1',并创建两个新列来对变量总和进行求和。这样工作正常,我可以得到正确的总发生次数,但我遇到的问题是,在我当前的ifelse语句中,如果记录的事件是变量“A”,则变量“B”被赋值为0.但是,对于每一行,我希望将前一个变量的值赋给当前行,这样我就不会得到从1到2,到0到3的间隙。

我也不想对此进行总结,我宁愿保留每个记录的实例并通过mutate运行新的列。

CURRENT DF:

Event Value Variable  Total.A  Total.B
    1     1     A         1        0
    2     1     A         2        0
    3     1     B         0        1
    4     1     A         3        0

期望的结果:

Event Value Variable  Total.A  Total.B
1     1     A         1        0
2     1     A         2        0
3     1     B         2        1
4     1     A         3        1

谢谢!

2 个答案:

答案 0 :(得分:4)

你可以使用布尔值的属性,你可以将它们加为1和0。因此,您可以使用cumsum - 函数:

DF$Total.A <- cumsum(DF$variable=="A")

或者作为一种更通用的方法,由@Frank提供,您可以这样做:

uv = unique(as.character(DF$Variable))
DF[, paste0("Total.",uv)] <- lapply(uv, function(x) cumsum(DF$V == x)) 

答案 1 :(得分:0)

如果你的因子有很多级别,你可以通过虚拟编码在一行中得到这个,然后X <- model.matrix(~Variable+0, DF) apply(X, 2, cumsum) 矩阵。

link_to