我有这个精确的数据框,只是长一点:
mydf <- data.frame(ids=c('D3022TexB4//D3022TexB7','D3022TexC10//D3026TexC1','D3021TexA6//D3022TexC8','D3022TexB4//D3022TexB7','D3021TexA6//D3022TexC8//D3026TexC2','D3022TexB4//D3022TexB7','D3019TexA5//D3022TexB4//D3026TexC1//D3026TexC3','D3021TexA7//D3021TexA10','D3022TexB8//D3026TexC4','D3022TexB6//D3022TexB9','D3022TexA2//D3026TexC5','D3022TexB4//D3022TexB7','D3022TexC10//D3026TexC1//D3026TexC3'),
rank=c(1,1,2,2,3,3,4,4,4,4,4,4,4),
group=c(1,2,1,2,1,2,1,2,3,4,5,6,7))
如下所示,
ids
组之间用//
分隔,以及它们的排名:
> mydf
ids rank group
1 D3022TexB4//D3022TexB7 1 1
2 D3022TexC10//D3026TexC1 1 2
3 D3021TexA6//D3022TexC8 2 1
4 D3022TexB4//D3022TexB7 2 2
5 D3021TexA6//D3022TexC8//D3026TexC2 3 1
6 D3022TexB4//D3022TexB7 3 2
7 D3019TexA5//D3022TexB4//D3026TexC1//D3026TexC3 4 1
8 D3021TexA7//D3021TexA10 4 2
9 D3022TexB8//D3026TexC4 4 3
10 D3022TexB6//D3022TexB9 4 4
11 D3022TexA2//D3026TexC5 4 5
12 D3022TexB4//D3022TexB7 4 6
13 D3022TexC10//D3026TexC1//D3026TexC3 4 7
我想要完成的第一件事是删除重复的
ids
条目,保留排名最低的条目(例如,保留 1 over 3)。
我可以这样做:
mydf <- mydf[!duplicated(mydf$ids),]
但是,一些较小的 id 组包含在较大的组中(并且它们的顺序可能不同),在这种情况下,我想保留较大的组。
总而言之,我的预期输出如下,但我不知道如何获得它......有任何线索吗?谢谢!
> mydf_final
ids rank group
1 D3022TexB4//D3022TexB7 1 1
5 D3021TexA6//D3022TexC8//D3026TexC2 3 1
7 D3019TexA5//D3022TexB4//D3026TexC1//D3026TexC3 4 1
8 D3021TexA7//D3021TexA10 4 2
9 D3022TexB8//D3026TexC4 4 3
10 D3022TexB6//D3022TexB9 4 4
11 D3022TexA2//D3026TexC5 4 5
13 D3022TexC10//D3026TexC1//D3026TexC3 4 7
aggregate
中的
min
和
Base R
功能,如下所示:
aggregate(cbind(rank, group) ~ ids, min, data = mydf)
输出:
ids rank group
1 D3019TexA5//D3022TexB4//D3026TexC1//D3026TexC3 4 1
2 D3021TexA6//D3022TexC8 2 1
3 D3021TexA6//D3022TexC8//D3026TexC2 3 1
4 D3021TexA7//D3021TexA10 4 2
5 D3022TexA2//D3026TexC5 4 5
6 D3022TexB4//D3022TexB7 1 1
7 D3022TexB6//D3022TexB9 4 4
8 D3022TexB8//D3026TexC4 4 3
9 D3022TexC10//D3026TexC1 1 2
10 D3022TexC10//D3026TexC1//D3026TexC3 4 7