考虑一个由分组变量(此处为 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
即对于每个
id
按date
获得第一.基于类似的计算器问题( 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/