所以我有以下data.frame
num id
1 44982 44979
2 44981 44979
3 43554 43551
4 43552 43551
5 42510 42507
6 42509 42507
7 41997 41994
8 41996 41994
9 40519 40517
10 40519 40517
11 40039 40036
12 40038 40036
13 31337 31335
14 31336 31335
15 31247 31245
16 31246 31245
17 43984 28769
18 28770 28769
19 27620 27618
20 27619 27618
可以看出," id"中有重复的内容。柱。我想要做的是根据" num"中的最大值选择要保留的副本。柱。因此,当在id列中重复执行重复项时,代码会查看num列,找到最高值行并删除最低值。输出看起来应该是这样的。
num id
1 44982 44979
2 43554 43551
3 42510 42507
4 41997 41994
5 40519 40517
6 40039 40036
7 31337 31335
8 31247 31245
9 43984 28769
10 27620 27618
11 27497 27495
12 44317 27374
13 10892 10697
14 10612 10606
15 10445 10443
16 10361 10359
17 10063 10061
18 9673 9671
19 9601 9599
20 8148 8146
感谢您提前提供任何帮助
答案 0 :(得分:7)
标准的 R 解决方案是:
aggregate(num~id, dat, max)
结果:
id num
1 27618 27620
2 28769 43984
3 31245 31247
4 31335 31337
5 40036 40039
6 40517 40519
7 41994 41997
8 42507 42510
9 43551 43554
10 44979 44982
您也可以使用data.table
执行此操作,如下所示:
require(data.table)
setDT(dat)[,.(num = max(num)),by=id]
setDF(dat) #making dat a normal data.frame again
这将返回每个id的最高值为num。
答案 1 :(得分:4)
使用data.table
包的可能更快的方法是先按递减顺序按num
排序,然后选择唯一id
s
library(data.table)
unique(setorder(setDT(df), -num), by = "id")
# num id
# 1: 44982 44979
# 2: 43984 28769
# 3: 43554 43551
# 4: 42510 42507
# 5: 41997 41994
# 6: 40519 40517
# 7: 40039 40036
# 8: 31337 31335
# 9: 31247 31245
# 10: 27620 27618
答案 2 :(得分:3)
您可以汇总最多
maxids <- aggregate(df$num, by=list(df$id), max) # get highest num for each id
names(maxids) <- c("id", "num") # rename result columns
或如上所示(一步):
maxids <- aggregate(num~id, df, max)
答案 3 :(得分:1)
而且,仅仅是为了记录,这是一个 dplyr 答案:
library(dplyr)
DF %>% group_by(id) %>% slice(which.max(num))
#Source: local data frame [10 x 2]
#Groups: id
#
# num id
#1 27620 27618
#2 43984 28769
#3 31247 31245
#4 31337 31335
#5 40039 40036
#6 40519 40517
#7 41997 41994
#8 42510 42507
#9 43554 43551
#10 44982 44979