首页 > 解决方案 > 识别组内重复值的第一个实例

问题描述

我有以下包含三列的数据框 -和FIRM( 0,1)。对于 every ,我想扫描所有年份并确定1的值重复多次(在连续行中)的第一种情况。然后,我想创建一个包含 0 的新列,其中包含 1 的所有年份,并且在它之前的年份包含 -1、-2、-3,在它之后的年份包含 1、2、3。YEARDUMMYFIRMDUMMYDUMMY

------------------------------
| FIRM | YEAR | DUMMY| NEW_COL
------------------------------
|  A   | 2006 |   0  |   0   |
------------------------------
|  A   | 2007 |   1  |   0   |
------------------------------
|  A   | 2008 |   0  |   0   |
------------------------------
|  B   | 2006 |   0  |   0   |
------------------------------
|  B   | 2007 |   0  |  -1   |
------------------------------
|  B   | 2008 |   1  |   0   |
------------------------------
|  B   | 2009 |   1  |   0   |
------------------------------
|  B   | 2010 |   0  |   1   |
------------------------------
|  B   | 2011 |   0  |   2   |
------------------------------
|  B   | 2012 |   1  |   3   |
------------------------------
|  B   | 2013 |   1  |   4   |
------------------------------

标签: rdataframesequencerepeat

解决方案


一个data.table解决方案。

根据您的描述,我认为 B 公司的 2006 年应该是-2。

library(data.table)

dt <- fread(' FIRM  YEAR  DUMMY NEW_COL
 A  2006  0  0 
 A  2007  1  0 
 A  2008  0  0 
 B  2006  0  0 
 B  2007  0  -1 
 B  2008  1  0 
 B  2009  1  0 
 B  2010  0  1 
 B  2011  0  2 
 B  2012  1  3 
 B  2013  1  4 ')


dt[,c("flag","grp"):=.((.N>1) & (DUMMY==1),
                       .GRP),by=.(FIRM,rleid(DUMMY))]
dt
#>     FIRM YEAR DUMMY NEW_COL  flag grp
#>  1:    A 2006     0       0 FALSE   1
#>  2:    A 2007     1       0 FALSE   2
#>  3:    A 2008     0       0 FALSE   3
#>  4:    B 2006     0       0 FALSE   4
#>  5:    B 2007     0      -1 FALSE   4
#>  6:    B 2008     1       0  TRUE   5
#>  7:    B 2009     1       0  TRUE   5
#>  8:    B 2010     0       1 FALSE   6
#>  9:    B 2011     0       2 FALSE   6
#> 10:    B 2012     1       3  TRUE   7
#> 11:    B 2013     1       4  TRUE   7

dt[flag==TRUE,result:=fifelse(grp==min(grp),0,99),by=.(FIRM)]
dt
#>     FIRM YEAR DUMMY NEW_COL  flag grp result
#>  1:    A 2006     0       0 FALSE   1     NA
#>  2:    A 2007     1       0 FALSE   2     NA
#>  3:    A 2008     0       0 FALSE   3     NA
#>  4:    B 2006     0       0 FALSE   4     NA
#>  5:    B 2007     0      -1 FALSE   4     NA
#>  6:    B 2008     1       0  TRUE   5      0
#>  7:    B 2009     1       0  TRUE   5      0
#>  8:    B 2010     0       1 FALSE   6     NA
#>  9:    B 2011     0       2 FALSE   6     NA
#> 10:    B 2012     1       3  TRUE   7     99
#> 11:    B 2013     1       4  TRUE   7     99



dt[,result:=lapply(.SD,function(x){
  if (any(!is.na(x==0))){
    position_0_head <- head(which(x==0),1)
    position_0_tail <- tail(which(x==0),1)
    x[1:position_0_head] <- 0 - (YEAR[position_0_head]-YEAR[1:position_0_head])
    x[position_0_tail:length(x)] <- 0 + (YEAR[position_0_tail:length(x)]-YEAR[position_0_tail])
  } else{
    x <- 0
  }
  x
}),.SDcols="result",by=.(FIRM)]

dt[,.SD,.SDcols = !c("flag","grp")]
#>     FIRM YEAR DUMMY NEW_COL result
#>  1:    A 2006     0       0      0
#>  2:    A 2007     1       0      0
#>  3:    A 2008     0       0      0
#>  4:    B 2006     0       0     -2
#>  5:    B 2007     0      -1     -1
#>  6:    B 2008     1       0      0
#>  7:    B 2009     1       0      0
#>  8:    B 2010     0       1      1
#>  9:    B 2011     0       2      2
#> 10:    B 2012     1       3      3
#> 11:    B 2013     1       4      4

reprex 包于 2020-04-25 创建(v0.3.0)


推荐阅读