在下面的数据表中,我想id
从列中选择具有唯一且最小值的行pos2
:
dt = data.table(id = c(1,2,2,3,3,3),
pos1 = c(0.1, 0.2, 0.2, 0.3, 0.3, 0.3),
pos2 = c(0.1, 0.25, 0.21, 0.34, 0.31, 0.32))
id pos1 pos2
1: 1 0.1 0.10
2: 2 0.2 0.25
3: 2 0.2 0.21
4: 3 0.3 0.34
5: 3 0.3 0.31
6: 3 0.3 0.32
Run Code Online (Sandbox Code Playgroud)
我现在做的方式是创建一个中间表:
dt.red = dt[, .(pos2 = first(sort(pos2))), by = id]
id pos2
1: 1 0.10
2: 2 0.21
3: 3 0.31
Run Code Online (Sandbox Code Playgroud)
然后,我合并以获得所需的最终结果:
merge(dt, dt.red)
id pos2 pos1
1: 1 0.10 0.1
2: 2 0.21 0.2
3: 3 0.31 0.3
Run Code Online (Sandbox Code Playgroud)
有没有更干净的方法可以通过data.table实现这一目标?
我们可以使用.I
来获取行索引并将其i
用于行子集
dt[dt[order(pos2), .I[1], by = id]$V1]
# id pos1 pos2
#1: 1 0.1 0.10
#2: 2 0.2 0.21
#3: 3 0.3 0.31
Run Code Online (Sandbox Code Playgroud)
或与 setorder
setorder(dt, id, pos2)[, .SD[1L], id]
Run Code Online (Sandbox Code Playgroud)
也可以在不使用的情况下执行此操作.I
,但速度会较慢*
dt[order(pos2), head(.SD, 1), id]
# id pos1 pos2
# 1: 1 0.1 0.10
# 2: 2 0.2 0.21
# 3: 3 0.3 0.31
Run Code Online (Sandbox Code Playgroud)
*也许不是,请参阅下面的评论
归档时间: |
|
查看次数: |
82 次 |
最近记录: |