r - 识别组内重复值的第一个实例
问题描述
我有以下包含三列的数据框 -和FIRM
( 0,1)。对于 every ,我想扫描所有年份并确定1的值重复多次(在连续行中)的第一种情况。然后,我想创建一个包含 0 的新列,其中包含 1 的所有年份,并且在它之前的年份包含 -1、-2、-3,在它之后的年份包含 1、2、3。YEAR
DUMMY
FIRM
DUMMY
DUMMY
------------------------------
| 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 |
------------------------------
解决方案
一个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)
推荐阅读
- vue.js - 如何在挂载或创建的函数中获取 Vuex 存储中的数据
- asp.net-web-api - 作为 Azure 应用服务运行时,UserPrincipal.DisplayName 抛出 COMException“访问被拒绝”,在本地开发笔记本电脑上工作正常
- angular - EventEmitter 不断发出值
- laravel - Dompdf 在 laravel 中使用 post 方法返回乱码数据
- html - 导航栏中的行和容器无法正常工作
- html - 导航栏标题不在中心
- android - Fabric crashlytics csyms 不存在
- python - 具有高级约束的 Scipy 投资组合优化
- r - R 在 filter_at 中的starts_with 错误(`starts_with()` 必须在 *selecting* 函数中使用。)
- wordpress - Wordpress:如何编辑有关电子邮件地址更改的邮件?