我有如下数据帧:
library(tidyverse)
data <- data.frame(
V1 = c("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a"),
V2 = c(1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2011),
V3 = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1)
)
我正在try 创建一个新列V4,它包含在V3从0变为1之前组V1
中的连续年数(V2
)的值.
data %>%
arrange(V1, V2) %>%
group_by(V1) %>%
mutate(
V4 = ifelse(V3 == 1, 0, seq_along(V2) - which.max(lead(V3, default = 0) == 1) - 1)
)
但这给了我以下输出:
a 1995 0 -8
a 1996 0 -7
a 1997 0 -6
a 1998 0 -5
a 1999 0 -4
a 2000 0 -3
a 2001 0 -2
a 2002 0 -1
a 2003 1 0
a 2004 0 1
a 2005 1 0
a 2006 0 3
a 2007 0 4
a 2008 0 5
a 2009 0 6
a 2010 0 7
a 2011 1 0
这样做的问题是,它正确地处理了第一种将V3
转换为1的情况,并正确地计算了转换之前的年数(使用负数,因为它们应该是负数).然而,在有多个交换机的情况下,它都会搞砸.我希望在V2
的每个switch 上重置年数,以便它只计算V2
中的另一个switch 之前的future 年份.因此,期望的输出将如下所示:
a 1995 0 -8
a 1996 0 -7
a 1997 0 -6
a 1998 0 -5
a 1999 0 -4
a 2000 0 -3
a 2001 0 -2
a 2002 0 -1
a 2003 1 0
a 2004 0 -1
a 2005 1 0
a 2006 0 -5
a 2007 0 -4
a 2008 0 -3
a 2009 0 -2
a 2010 0 -1
a 2011 1 0
如果future 没有V3
=1的年份,那么V4
应该默认为-1.我如何在r中编码,以便V3
之前的年数为1只是future 的年数,对于每一特定的行,其中V3
是0?