【发布时间】:2015-02-11 10:16:08
【问题描述】:
我有一个这样的数据表。
> 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
我只想为每个 ID 选择一个 值。它可以是第一个值或最后一个值。我就是这样做的。
unique_id_value_mapping <- dt[, list(new_value=head(.SD[,value],1)), by="ID"]
但对于大型数据表(约 10 万行),这需要大量时间。有谁知道更快的方法吗?
更新
针对上述问题提出的答案效果很好。
但是,如果我需要根据某些条件选择值怎么办。考虑一个数据表
> 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
并且我只想为每个 ID 选择一个 值,只要该 ID 的 days 是最大值。我就是这样做的。
unique_id_value_mapping <- dt[, list(new_value=head(.SD[days==max(days),value])), by="ID"]
如何更快?
【问题讨论】:
-
你为什么使用
.SD?这是没有意义的。为什么不只是dt[, .(new_value = head(value, 1)), ID]或dt[, .(new_value = tail(value, 1)), ID]?head和tail都是非常高效的函数,因此您应该获得最大的速度。速度下降的另一个原因是,如果您有大量唯一的IDs,这将使这基本上是一个行操作(这总是很慢)。 -
@DavidArenburg 在 1e6 数据集上,头部,尾部,定时
0.014 -
@akrun 这和你的时间一样,不是吗?
system.time有一些差异,所以我猜它在阈值之内。 -
@DavidArenburg 是的,类似。
-
也许
dt[, .(new_value = value[which.max(days)]), ID]
标签: r data.table