我有一个这样的数据表。
> 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的最大值。我就是这样做的。
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]
关于r - 为数据表中的每个唯一值仅选择第一个或最后一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28451699/