2016-01-13 26 views
1

我想在两个单独的列上运行一个数据帧上的cumsum。它们基本上是针对两个不同变量的事件列表。数据框中每行只有一个变量可以记录事件。我攻击这个问题的方式是创建一个新变量,保存值为'1',并创建两个新列以对变量总和求和。这工作正常,我可以得到正确的事件总数,但我遇到的问题是,在我当前的ifelse语句中,如果记录的事件是变量“A”,则变量“B”被赋值为0。 ,对于每一行,我都希望将前一个变量的值分配给当前行,这样我就不会在从1到2到0到3的间隙结束。与上一行值Mutate Cumsum

我不'要想在这个上进行总结,我宁愿保留每个记录的实例并通过mutate运行新的列。

当前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 

谢谢!

+3

'mydf $ Total.A < - cumsum(mydf $ variable ==“A”)'做你想要的吗? – Heroka

+0

@贺冈点,非常感谢!有没有办法将评论标记为答案? – wetcoaster

回答

4

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

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

如果有许多层级的因素,你可以通过虚拟编码得到这一行,然后用矩阵表示。

X <- model.matrix(~Variable+0, DF) 
apply(X, 2, cumsum)