根据唯一ID

时间:2016-02-18 18:18:59

标签: r

所以我想要做的是删除基于ID的最后一个值的每个元素。我有一个相当大的数据集,因此手动执行它并不是最佳选择。

以下是一些示例值。

ID <- c(1, 1, 1, 231313, 231313, 45, 45, 89, 89, 89, 89)
distance <- c(0.3, 1.2, 0.8, 0.5, 6789, 0.1, 349495, 0.1, 0.3, 0.9, 49494)
data <- data.frame(ID = ID, distance = distance)

为了更清楚,我想删除0.8,6789,349495和49494与&#34;&#34;因为它们是每个唯一ID的最后一个值。

结果如下:

ID      distance
1       0.3
1       1.2
1
231313  0.5
231313
45      0.1
45
89      0.1
89      0.3
89      0.9
89

2 个答案:

答案 0 :(得分:1)

我们可以替换每个&#39; ID&#39;的最后一个值,而不是创建''并将列classnumeric更改为character。为NA。使用data.table,我们会转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(data)),获取每个&#39; ID的最后一行(.I)的行索引(.N),我们分配&#39;距离&#39 ;对应于那些行&#39; NA&#39;。

library(data.table)
i1 <- setDT(data)[, .I[.N], ID]$V1
data[i1, distance:= NA_real_]
data
#        ID distance
# 1:      1      0.3
# 2:      1      1.2
# 3:      1       NA
# 4: 231313      0.5
# 5: 231313       NA
# 6:     45      0.1
# 7:     45       NA
# 8:     89      0.1
# 9:     89      0.3
#10:     89      0.9
#11:     89       NA

或者我们可以一步完成

setDT(data)[1:.N ==.N , distance:= NA_real_ ,ID]

答案 1 :(得分:1)

使用&#34;&#34;通常不是一个好主意。因为&#39;失踪&#39; (例如,它将数值强制转换为字符串)。 Base R功能查找那些不重复的(从结尾开始),并更新相应的列

> data[!duplicated(data$ID, fromLast=TRUE), "distance"] = NA
> data
       ID distance
1       1      0.3
2       1      1.2
3       1       NA
4  231313      0.5
5  231313       NA
6      45      0.1
7      45       NA
8      89      0.1
9      89      0.3
10     89      0.9
11     89       NA