【问题标题】:Earliest Date for each id in RR中每个id的最早日期
【发布时间】:2016-12-18 00:50:57
【问题描述】:

我有一个数据集,其中每个人 (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),]

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

【问题讨论】:

  • 最好提供可重现的数据,尤其是在处理日期时。我创建了自己的示例,aggregatemin 工作正常,所以你真的需要 dput 数据。 stackoverflow.com/help/mcve 另请参阅 R 标签描述中的共享数据指南。
  • e_date 列的格式是什么?也看看this

标签: r date aggregate


【解决方案1】:

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

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

或者使用dplyr,在按'id'分组后,arrange'e_date'(假设它属于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)),]

【讨论】:

  • 您能否提供一个基本 R 选项的可重现示例?尝试了几个数据框,但收到错误:“as.Date.default(value) 中的错误:不知道如何将 'value' 转换为类“Date”” 我使用的日期变量绝对是日期变量.谢谢
  • @LeroyTyrone 向 OP 询问不是更好吗
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以使用 library(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 early_date
    123 2014-03-01
    456 2015-07-08
    789 2015-12-11

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2022-01-03
        • 1970-01-01
        • 2020-11-09
        • 2020-01-18
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 2021-03-13
        • 1970-01-01
        相关资源
        最近更新 更多