R中每个id的最早日期

pie*_*tro 7 aggregate r date

我有一个数据集,其中每个人(id)都有一个e_date,并且因为每个人都可以拥有多个e_date,所以我试图获得每个人的最早日期.所以基本上我想有一个数据集,每个id每行显示一行,显示他最早的e_date值.我使用聚合函数来查找最小值,我创建了一个组合日期和id的新变量,最后我使用创建的新变量基于包含最小值的原始数据集进行子集化.我来这个:

new <- aggregate(e_date ~ id, data_full, min)

data_full["comb"] <- NULL
data_full$comb <- paste(data_full$id,data_full$e_date)

new["comb"] <- NULL
new$comb <- paste(new$lopnr,new$EDATUM)

data_fixed <- data_full[which(new$comb %in% data_full$comb),]
Run Code Online (Sandbox Code Playgroud)

第一件事是聚合函数似乎根本不起作用,它减少了行数但查看数据我可以清楚地看到一些id出现不同的e_date不止一次.另外,当我使用as.Date格式而不是日期(整数)的原始格式时,代码给出了不同的结果.我认为答案很简单,但我很震惊.

akr*_*run 12

我们可以用data.table.将'data.frame'转换为'data.table'(setDT(data_full)),按'id'分组,我们得到第1行(head(.SD, 1L)).

library(data.table)
setDT(data_full)[order(e_date), head(.SD, 1L), by = id]
Run Code Online (Sandbox Code Playgroud)

或者dplyr,在使用'id'分组后,arrange使用'e_date'(假设它是Date类)并获取第一行slice.

library(dplyr)
data_full %>%
    group_by(id) %>%
    arrange(e_date) %>%
    slice(1L)
Run Code Online (Sandbox Code Playgroud)

如果我们需要一个base R选项,ave可以使用

data_full[with(data_full, ave(e_date, id, FUN = function(x) rank(x)==1)),]
Run Code Online (Sandbox Code Playgroud)


小智 8

使用 dplyr 的 filter 命令的另一个答案:

dta %>% 
  group_by(id) %>%
  filter(date == min(date))
Run Code Online (Sandbox Code Playgroud)