在R Data.Table中创建一个计数器列,并在另一列上设置条件
我试图数一数有记录以来,一种产品上市的年份 在下面的示例中,我希望在记录的第一个非零销售额处启动计数器 请注意,在接下来的几年中,我可能没有记录的销售额,但计数器应将这些年视为有效 我尝试了在R Data.Table中创建一个计数器列,并在另一列上设置条件,r,data.table,R,Data.table,我试图数一数有记录以来,一种产品上市的年份 在下面的示例中,我希望在记录的第一个非零销售额处启动计数器 请注意,在接下来的几年中,我可能没有记录的销售额,但计数器应将这些年视为有效 我尝试了rleid,但无法找出一种方法来区分最初的0和寿命内的0 tt <- data.table(YEAR=2007:2018, SALES=c(0,0,0,2,3,5,1,0,9,0,3,4), YEARS_IN=c(0,0,0,1,2,3
rleid
,但无法找出一种方法来区分最初的0和寿命内的0
tt <- data.table(YEAR=2007:2018,
SALES=c(0,0,0,2,3,5,1,0,9,0,3,4),
YEARS_IN=c(0,0,0,1,2,3,4,5,6,7,8,9))
> tt
YEAR SALES YEARS_IN
1: 2007 0 0
2: 2008 0 0
3: 2009 0 0
4: 2010 2 1
5: 2011 3 2
6: 2012 5 3
7: 2013 1 4
8: 2014 0 5
9: 2015 9 6
10: 2016 0 7
11: 2017 3 8
12: 2018 4 9
tt
年销售额年数
1: 2007 0 0
2: 2008 0 0
3: 2009 0 0
4: 2010 2 1
5: 2011 3 2
6: 2012 5 3
7: 2013 1 4
8: 2014 0 5
9: 2015 9 6
10: 2016 0 7
11: 2017 3 8
12: 2018 4 9
库(data.table)
tt库(数据表)
tt这是一个使用基数R的单线解决方案-
tt <- data.table::data.table(YEAR=2007:2018,
SALES=c(0,0,0,2,3,5,1,0,9,0,3,4),
YEARS_IN=c(0,0,0,1,2,3,4,5,6,7,8,9))
tt$Calc_Years <- cumsum(cumsum(tt$SALES) > 0)
tt
YEAR SALES YEARS_IN Calc_Years
1: 2007 0 0 0
2: 2008 0 0 0
3: 2009 0 0 0
4: 2010 2 1 1
5: 2011 3 2 2
6: 2012 5 3 3
7: 2013 1 4 4
8: 2014 0 5 5
9: 2015 9 6 6
10: 2016 0 7 7
11: 2017 3 8 8
12: 2018 4 9 9
这是一个使用base R的单线解决方案-
tt <- data.table::data.table(YEAR=2007:2018,
SALES=c(0,0,0,2,3,5,1,0,9,0,3,4),
YEARS_IN=c(0,0,0,1,2,3,4,5,6,7,8,9))
tt$Calc_Years <- cumsum(cumsum(tt$SALES) > 0)
tt
YEAR SALES YEARS_IN Calc_Years
1: 2007 0 0 0
2: 2008 0 0 0
3: 2009 0 0 0
4: 2010 2 1 1
5: 2011 3 2 2
6: 2012 5 3 3
7: 2013 1 4 4
8: 2014 0 5 5
9: 2015 9 6 6
10: 2016 0 7 7
11: 2017 3 8 8
12: 2018 4 9 9
rleid(SALES)-1
?很好@thelatemail,但你可能是指rleid(tt[,SALES])-1
@ChrissPaul-我假设它会放在一个数据中。表调用类似于-tt[,rleid(SALES)-1]
你可以使用purr detect函数来确定第一个非零销售年:first.yearrleid(SALES)-1
?很好@thelatemail,但您可能是指rleid(tt[,SALES])-1
@ChrissPaul-我假设它会放在一个数据中。类似于-tt[,rleid(SALES)-1]的表调用
您可以使用purr detect函数来确定第一个非零销售年:first.yeartt[,Calc_Years:=cumsum(cumsum(SALES>0))]
很好的答案。作为data.table语句编写,这将是:tt[,计算年份:=cumsum(cumsum(SALES>0))]
tt[ , Calc_Years := cumsum(cumsum(SALES) > 0)]