Select 数据中每个唯一值只有第一个或最后一个值 table?

Select only first or last value for each unique value in data table?

我有一个这样的数据table。

> dt
    ID value
 1   a  v1
 2   a  v2
 3   a  v3
 4   a  v4
 5   a  v5
 6   b  v6
 7   b  v7
 8   b  v8

并且我想 select 每个 ID 只有一个 value。它可以是第一个值或最后一个值。我就是这样做的。

unique_id_value_mapping <- dt[, list(new_value=head(.SD[,value],1)), by="ID"]

但是对于大数据 tables(~10 万行),它需要花费很多时间。有人知道更快的方法吗?

更新
为上述问题建议的答案工作正常。 但是,如果我需要根据某些条件选择值怎么办。考虑一个数据table

> dt
    ID value days
 1   a  v1     2
 2   a  v2     4
 3   a  v3     7 *
 4   a  v4     7
 5   a  v5     1
 6   b  v6     5 *
 7   b  v7     4
 8   b  v8     2

我想 select 每个 ID 只有一个 value days[=36] =] 是 ID 的最大值。我就是这样做的。

unique_id_value_mapping <- dt[, list(new_value=head(.SD[days==max(days),value])), by="ID"]

如何更快地完成?

尝试

dt[, list(new_value=value[1L]), ID]
dt[, list(new_value= value[.N]), ID]

使用更大的数据集

set.seed(24)
df1 <- data.frame(ID= sample(1:100, 1e6, replace=TRUE), 
     value=rnorm(1e6))
dt1 <- as.data.table(df1)
system.time(dt1[, list(new_value=value[1L]), ID])
#   user  system elapsed 
#  0.012   0.000   0.013 
 system.time(dt1[, list(new_value=value[.N]), ID])
#  user  system elapsed 
#  0.011   0.000   0.012 

更新

根据@David Arenburg 建议的新更新

 dt[, list(new_value = value[which.max(days)]), by = ID]
 #    ID new_value
 #1:  a        v3
 #2:  b        v6

假设您需要满足条件的行

 dt[dt[, .I[which.max(days)], by = ID]$V1]
 #   ID value days
 #1:  a    v3    7
 #2:  b    v6    5

 dt[, .SD[which.max(days)], by = ID]