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]
我有一个这样的数据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]