返回唯一组合的ID

时间:2019-10-29 13:24:45

标签: r dplyr data.table

我的数据表具有以下格式

ID   Var1   Var2   Var3   ...
1_1  0      0      1      ...
1_2  1      1      0      ...
1_3  0      0      1      ...
...  ...    ...    ...    ...

我想从唯一组合(Var列)中提取ID。获取唯一组合不是问题(plyr::count()aggregate()等),我想提取有助于这些唯一组合的id变量。

输出应该看起来像这样

Var1   Var2   Var3   IDs
0      0      1      1_1, 1_3
1      1      0      1_2

其中IDs列是构成唯一组合的所有ID的向量/列表。

我尝试了R packagedplyr管道,到目前为止没有任何效果。

任何建议甚至R程序包如何处理此任务?

谢谢!

3 个答案:

答案 0 :(得分:11)

您可以将group_by_at与匹配列名的模式一起使用,并进行总结,即

df %>% 
 group_by_at(vars(contains('Var'))) %>% 
 summarise(IDs = toString(ID))

给出,

# A tibble: 2 x 4
# Groups:   Var1, Var2 [2]
   Var1  Var2  Var3 IDs     
  <int> <int> <int> <chr>   
1     0     0     1 1_1, 1_3
2     1     1     0 1_2     

答案 1 :(得分:5)

df %>% group_by_at(.vars=-1) %>% summarize(IDs=list(ID))

类似于Sotos的解决方案,但假设所有其他列都需要唯一,并且IDs列将是列表的列而不是字符串,则简化了ID列的选择。

# A tibble: 2 x 4
# Groups:   Var1, Var2 [2]
   Var1  Var2  Var3 IDs      
  <int> <int> <int> <list>   
1     0     0     1 <chr [2]>
2     1     1     0 <chr [1]>

只是为了好玩,您可以使用tidyr的{​​{1}}函数进一步简化它:

nest

这仍然将ID留在列表中,这对您可能有用也可能没有用,但在标题中更清楚地显示了它。将列保留为列表而不是字符串的另一个好处是,您可以使用require(tidyr) nest(df,IDs=ID) # A tibble: 2 x 4 Var1 Var2 Var3 IDs <int> <int> <int> <S3: vctrs_list_of> 1 0 0 1 1_1, 1_3 2 1 1 0 1_2 轻松地重新创建原始表:

unnest

答案 2 :(得分:1)

使用汇总且唯一

aggregate(dat$ID,list(dat$Var1,dat$Var2,dat$Var3),unique)