r - 使用 `data.table` 根据变量获取第一个子组

标签 r data.table

考虑一个由分组变量(此处为 id )和一个有序变量(此处为 date )组成的数据集

(df <- data.frame(
  id = rep(1:2,2),
  date = 4:1
))
#   id date
# 1  1    4
# 2  2    3
# 3  1    2
# 4  2    1

我想知道什么是最简单的方法 data.table做相当于这个 dplyr代码:
library(dplyr)
df %>%
  group_by(id) %>%
  filter(min_rank(date)==1)
# Source: local data frame [2 x 2]
# Groups: id
# 
#   id date
# 1  1    2
# 2  2    1

即对于每个 iddate获得第一.

基于类似的计算器问题( Create an "index" for each element of a group with data.table ),我想出了这个
library(data.table)
dt <- data.table(df)
setkey(dt, id, date)
for(k in unique(dt$id)){
  dt[id==k, index := 1:.N]
}
dt[index==1,]

但似乎应该有一个单线为此。不熟悉data.table我想过这样的事情
dt[,,mult="first", by=id]

应该工作,但唉!最后一点代码似乎应该按 id 分组然后取第一个(在 id 内将由 date 确定,因为我以这种方式设置了键。)

编辑

多亏了 Ananda Mahto,这个单线现在将在我的 data.table 中轨道
dt[,.SD[1], by=id]
#    id date
# 1:  1    2
# 2:  2    1

最佳答案

直接与您的来源合作 data.frame , 你可以试试:

setkey(as.data.table(df), id, date)[, .SD[1], by = id]
#    id date
# 1:  1    2
# 2:  2    1

扩展您的原始想法,您可以这样做:
dt <- data.table(df)
setkey(dt, id, date)
dt[, index := sequence(.N), by = id][index == 1]
#    id date index
# 1:  1    2     1
# 2:  2    1     1

可能在一定程度上,大卫关于 head 是正确的。对比 [1] ,但我不确定那会是什么规模。
set.seed(1)
nrow <- 10000
ncol <- 20

df <- data.frame(matrix(sample(10, nrow * ncol, TRUE), nrow = nrow, ncol = ncol))

fun1 <- function() setkey(as.data.table(df), X1, X2)[, head(.SD, 1), by = X1]
fun2 <- function() setkey(as.data.table(df), X1, X2)[, .SD[1], by = X1]

library(microbenchmark)
microbenchmark(fun1(), fun2())
# Unit: milliseconds
#    expr       min        lq      mean    median        uq      max neval
#  fun1() 12.178189 12.496777 13.400905 12.808523 13.483545 30.28425   100
#  fun2()  4.474345  4.554527  4.948255  4.620596  4.965912  8.17852   100

关于r - 使用 `data.table` 根据变量获取第一个子组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26777419/

相关文章:

r - 带有 ggmap 的 R 中自定义属性的地理热图

R data.table条件和: Cleaner way

r - 使用 lapply 和 get 时的 data.table 列顺序

r - 加快在大型 R 数据框中搜索索引的速度

r - 每个人具有多个/堆叠变量的热图

R在错误时继续循环

r - R 条形图的组着色错误

R:data.table 与合并(聚合())性能

r - 如何根据 data.table 中的其他列创建新列?

r - 当变量名称存储在字符向量中时选择/分配给 data.table