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

标签 r data.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

我只想为每个 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/

相关文章:

linux - 提取值与特定模式匹配的列

r - 在R中创建对称矩阵

c - 这是 lapack 问题还是我的代码中的错误?

r - 如何使用数据表获取 R 中自上次日期(滞后)以来的时间差?

r - 非对等连接的结果中的顺序是如何确定的?

R data.table lapply 带剪切功能

r - 简化为多个 R 版本构建 R Windows 二进制文件的过程

r - R中按列名排列矩阵组列表的矩阵

r - 在 data.table 中按 n 个不同的组创建 n 个新列

r - 如何在 R 中按列将一个 data.table 除以另一个 data.table?