所以我想要做的是删除基于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
答案 0 :(得分:1)
我们可以替换每个&#39; ID&#39;的最后一个值,而不是创建''
并将列class
从numeric
更改为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