返回唯一组合的ID

teb*_*ebi 6 r dplyr data.table

我的数据表具有以下格式

ID   Var1   Var2   Var3   ...
1_1  0      0      1      ...
1_2  1      1      0      ...
1_3  0      0      1      ...
...  ...    ...    ...    ...
Run Code Online (Sandbox Code Playgroud)

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

输出应该看起来像这样

Var1   Var2   Var3   IDs
0      0      1      1_1, 1_3
1      1      0      1_2
Run Code Online (Sandbox Code Playgroud)

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

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

有什么建议甚至R包如何处理此任务?

谢谢!

Sot*_*tos 11

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

df %>% 
 group_by_at(vars(contains('Var'))) %>% 
 summarise(IDs = toString(ID))
Run Code Online (Sandbox Code Playgroud)

这使,

# 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     
Run Code Online (Sandbox Code Playgroud)


iod*_*iod 5

df %>% group_by_at(.vars=-1) %>% summarize(IDs=list(ID))
Run Code Online (Sandbox Code Playgroud)

与Sotos的解决方案类似,但是假设所有其他列都需要唯一,并且ID列将是列表的列而不是字符串,从而简化了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]>
Run Code Online (Sandbox Code Playgroud)

只是为了好玩,您可以使用tidyrnest功能进一步简化它:

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   
Run Code Online (Sandbox Code Playgroud)

这仍然将ID留在列表中,这可能对您有用也可能没有用,但在标题中更清楚地显示了它。将列保留为列表而不是字符串的另一个好处是,您可以使用unnest以下命令轻松地重新创建原始表:

unnest(nest(dd,IDs=ID),cols=IDs)
# A tibble: 3 x 4
   Var1  Var2  Var3 ID   
  <int> <int> <int> <chr>
1     0     0     1 1_1  
2     0     0     1 1_3  
3     1     1     0 1_2  
Run Code Online (Sandbox Code Playgroud)