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)
这使,
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
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)
只是为了好玩,您可以使用tidyr的nest功能进一步简化它:
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)