【问题标题】:Create flag based on column with multiple values per unique ID in R基于 R 中每个唯一 ID 具有多个值的列创建标志
【发布时间】:2018-08-05 09:40:51
【问题描述】:

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

我有一个看起来像这样的数据框“数据”,但有超过 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 的第一个值,而我的数据每人每年有 1000 个 VarA。我希望我的标志为每个独特的人筛选所有可能的 VarA,并且在满足条件时只标记一次,无论按年份或按条件重复。因为还有很多不同的可能 VarA,所以我不想使用 dcast(melt 来重塑它,因为每个独特的 VarA 都有自己的列。

我想避免循环,因为我的数据集太大了...但如果归根结底是这样,希望帮助编写适当的代码。

有没有人有我可以采取的任何想法或不同的方法?

提前谢谢你。

【问题讨论】:

  • 我有点不确定你的目标是什么——找出每个人至少有一次“VarA”的哪些值?标记发生的第一年的重要性体现在哪里?
  • 嗨!我使用 Flagabc 的目标是查看有多少独特的个人拥有 a、b 或 c。我还需要为 VarA= d、e 或 f 等情况制作标志。无论哪一年或多少次出现相同的 VarA 值,我都希望我的 Flagabc=1 每人一次(只要 a、b 或 c 出现在该人的 VarA 中)。它与发生的第一年无关,因为它与个体 VarA 中存在的 a、b 或 c 有关。这有意义吗?
  • 基于此,听起来您可以计算 ID 和 VarA 的每个组合的出现次数,而忽略年份。任何大于零的计数都意味着 ID 至少展示了 VarA 一次?或者您的意思是“Flagabc”意味着计算包含 a OR b OR c 至少一次但忽略值 d/e/f (等)的 ID?
  • 我相信我正在寻找后者。最终,使用 Flagabc,我想计算在数百万个不同的 VarA 中有多少个唯一 ID 具有 a、b 或 c。

标签: r variables conditional unique


【解决方案1】:

使用 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这部分在满足给定条件的情况下选择每组第一行的索引

【讨论】:

  • 非常感谢!这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 2023-01-05
  • 2021-08-24
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多