根据 R 中每个唯一 ID 具有多个值的列创建标志

Create flag based on column with multiple values per unique ID in R

我搜索了 Stack Overflow,但找不到类似的问题...如果您知道,请向我推荐。

我有一个数据框 "data",看起来像这样,但有超过 8000 万行和 VarA 的数百万种可能性:

ID YEAR  VarA      
1  2014  a     
1  2015  a      
1  2014  b             
1  2015  c             
2  2014  a        
2  2015  b        
2  2016  c        

我想创建一个标志,其中对于每个唯一 ID,我们计算一个条件 VarA 一次。例如,如果我想标记 VarA 可能是 "a"、"b" 或 "c" 的所有实例,我希望每个唯一个体对它们计数一次:

ID YEAR  VarA  Flagabc     
1  2014  a     1  
1  2015  a     0
1  2014  b     0      
1  2015  c     0      
2  2014  a     1 
2  2015  b     0 
2  2016  c     0

我尝试先将我的数据重塑为宽格式并创建标志:

    data.w <- reshape(data=data, direction="wide", idvar="ID", timevar="YEAR")
    data.w$Flagabc <- data.w$VarA %in% c("a", "b", "c")

但是好像只包含了每年的VarA的第一个值,而我的数据是每人每年有1000s的VarA。我希望我的标志为每个独特的人筛选每个可能的 VarA,并且只标记一次,无论按年份或按条件重复,当条件满足时。因为也有很多不同的可能的 VarA,所以我不想使用 dcast 重塑它(在每个独特的 VarA 都有自己的列的地方熔化。

我想避免循环,因为我的数据集太大了...但如果这就是问题所在,我希望能帮助您编写适当的代码。

有人有什么想法或我可以采用的不同方法吗?

提前谢谢你。

使用data.table,它是一条线。

> setDT(df)
> df[,Flagabc := 0]
> df[df[VarA %in% c('a','b','c'), .I[1], by=ID]$V1, Flagabc:=1]
   ID YEAR VarA Flagabc
1:  1 2014    a       1
2:  1 2015    a       0
3:  1 2014    b       0
4:  1 2015    c       0
5:  2 2014    a       1
6:  2 2015    b       0
7:  2 2016    c       0

说明

  • df[VarA %in% c('a','b','c'), .I[1], by=ID]$V1这部分在满足给定条件的情况下选择每组第一行的索引