gpt4 book ai didi

r - 为数据表中的每个唯一值仅选择第一个或最后一个值?

转载 作者:行者123 更新时间:2023-12-02 09:34:30 25 4
gpt4 key购买 nike

我有一个这样的数据表。

> 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com