我有如下数据帧:

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?

推荐答案

您可以按dplyr::consecutive_id(V3)分组来计算到切换之前的年份,然后使用rev(cumsum(rev(V3)))来识别没有1的位置.

library(dplyr)

data %>%
  mutate(tmp = consecutive_id(V3), .by = V1) %>%
  mutate(
    V4 = ifelse(V3 == 1, 0, -rev(seq_along(V2))),
    .by = c(V1, tmp)
  ) %>%
  mutate(
    V4 = ifelse(rev(cumsum(rev(V3))) == 0, -1, V4),
    tmp = NULL,
    .by = V1
  )

结果:

   V1   V2 V3 V4
1   a 1995  0 -8
2   a 1996  0 -7
3   a 1997  0 -6
4   a 1998  0 -5
5   a 1999  0 -4
6   a 2000  0 -3
7   a 2001  0 -2
8   a 2002  0 -1
9   a 2003  1  0
10  a 2004  0 -1
11  a 2005  1  0
12  a 2006  0 -5
13  a 2007  0 -4
14  a 2008  0 -3
15  a 2009  0 -2
16  a 2010  0 -1
17  a 2011  1  0
18  a 2011  1  0

R相关问答推荐

如何从其他前面列中减go 特定列的平均值?

在ggplot Likert条中添加水平线

如何删除多个.CSV文件的行

行式dppr中的变量列名

如何按排序顺序打印一个框架中所有精确的唯一值?

将向量组合到一个数据集中,并相应地命名行

如何编辑gMarginal背景以匹配绘图背景?

在R中使用Scale_y_Break后更改y轴标签

Select 季度月值

按多列统计频次

R:用GGPLATE,如何在两个独立的变量中制作不同形状的散点图?

在R中,如何将误差条放置在堆叠的每个条上?

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

循环遍历多个变量,并将每个变量插入函数R

如何使用包metaviz更改标签的小数位数?

roxygen2正在处理太多的文件

带有Bootswatch Cerulean主题的shiny 仪表板中的浏览&按钮可见性问题

R:水平旋转图

使用nls()函数的非线性模型的半正态图

使用循环改进功能( struct 简单)