Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R Data.Table中创建一个计数器列,并在另一列上设置条件_R_Data.table - Fatal编程技术网

在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)]