21

因此,我在 R 中有一个数据集,其布局如下:

ID Date Tally
1 2/1/2011 1
2 2/1/2011 2
3 2/1/2011 3
1 2/1/2011 4
2 2/1/2011 5
1 2/1/2011 6
3 2/1/2011 7
4 2/1/2011 8
2 2/1/2011 9

我想删除除了帖子 ID 的最后一个实例之外的所有实例。现在我可以在网上找到的所有东西,我正在使用的功能正在删除除第一个实例之外的所有内容。

所以我的新数据框看起来像:

ID Date Tally
1 2/1/2011 6
3 2/1/2011 7
4 2/1/2011 8
2 2/1/2011 9

我该怎么做呢?现在我只能保留第一个实例。我希望它做相反的事情?有什么帮助吗?

4

4 回答 4

26

这不只是使用“fromLast”参数的标准情况duplicated吗?

 dat[ !duplicated(dat[, c("ID", "Date")], fromLast=T),]
#---------
  ID     Date Tally
6  1 2/1/2011     6
7  3 2/1/2011     7
8  4 2/1/2011     8
9  2 2/1/2011     9

您的示例不够丰富,无法判断您是否需要重复测试中的“日期”列,因此也许您可以简化。我将其保留以说明duplicated具有 data.frame 方法。我更喜欢!duplicated这样做,unique因为如果您正在比较组,它可以轻松访问设置的补码。

于 2013-03-26T17:00:41.390 回答
14

用于!rev(duplicated(rev(ID)))过滤除最后一个唯一事件之外的所有事件。

要过滤数据集,请使用dataset[!rev(duplicated(rev(dataset$ID))),]

于 2013-03-26T16:15:54.247 回答
4

使用data.table连接,您可以设置mult = 'last'

例如

library(data.table)
DT <- data.table(DF, key = 'id')

# join with the unique ID values
DT[unique(DT[,list(ID)]), mult= 'last']

   ID     Date Tally
1:  1 2/1/2011     6
2:  2 2/1/2011     9
3:  3 2/1/2011     7
4:  4 2/1/2011     8

如果您知道唯一 ID,您还可以执行以下任何操作

DT[.(1:4), mult='last']
DT[list(1:4), mult = 'last']
于 2013-03-26T22:26:50.687 回答
4

使用 dplyr:

data <- data %>%
  group_by(ID) %>%
  slice(which.max(Tally))
于 2016-10-18T18:10:52.697 回答