R中每个id的最早日期

时间:2016-08-11 10:24:50

标签: r date aggregate

我有一个数据集,其中每个人( id )都有 e_date ,并且由于每个人都可以有多个 e_date ,我和#39;我试图获得每个人的最早日期。所以基本上我想要一个数据集,每个 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),]

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

4 个答案:

答案 0 :(得分:11)

我们可以使用data.table。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(data_full)),按&#39; id&#39;分组,我们得到第1行(head(.SD, 1L))。

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

或者使用dplyr,按照&#39; id&#39;,arrange分组&#39; e_date&#39; (假设它是Date类)并获得slice的第一行。

library(dplyr)
data_full %>%
    group_by(id) %>%
    arrange(e_date) %>%
    slice(1L)

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

data_full[with(data_full, ave(e_date, id, FUN = function(x) rank(x)==1)),]

答案 1 :(得分:1)

我做了一个可重复的例子,假设你按照他们所在的季度对某些日期进行了分组。

library(lubridate)
library(dplyr)
rand_weeks <- now() + weeks(sample(100))
which_quarter <- quarter(rand_weeks)
df <- data.frame(rand_weeks, which_quarter)

df %>%
  group_by(which_quarter) %>% summarise(sort(rand_weeks)[1])

# A tibble: 4 x 2
  which_quarter sort(rand_weeks)[1]
          <dbl>              <time>
1             1 2017-01-05 05:46:32
2             2 2017-04-06 05:46:32
3             3 2016-08-18 05:46:32
4             4 2016-10-06 05:46:32

答案 2 :(得分:1)

您可以使用库(sqldf)获取最短日期,如下所示:

data1<-data.frame(id=c("789","123","456","123","123","456","789"),
                  e_date=c("2016-05-01","2016-07-02","2016-08-25","2015-12-11","2014-03-01","2015-07-08","2015-12-11"))  

library(sqldf)
data2 = sqldf("SELECT id,
                    min(e_date) as 'earliest_date'
                    FROM data1 GROUP BY 1", method = "name__class")    

head(data2)   

id earliest_date
123 2014-03-01
456 2015-07-08
789 2015-12-11

答案 3 :(得分:0)

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

dta %>% 
  group_by(id) %>%
  filter(date == min(date))