如何在R中的data.frame中提取子序列的最后日期?

时间:2013-01-23 07:36:31

标签: r date dataframe subset

我在以下数据集中苦苦挣扎了一段时间:

    id   date       var1 var2     
1   7031 2008-12-01  27  1
2   7031 2009-01-05   6  0
3   7031 2009-02-02   0  3
4   7031 2008-11-01   1  4
5   7500 2009-07-11  30  0
6   7500 2009-10-01   8  0
7   7500 2010-01-01   0  0
8   7041 2009-06-20  26  0
9   7041 2009-08-01   0  0
10  0277 2009-01-01   3  0

我想为每个id输出具有非零变量的最后一个日期。这些用户的时间序列长度不同。我希望像输出一样:

id   last_date
7031 2009-02-02
7500 2009-10-01
7041 2009-06-20
0277 2009-01-01

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:5)

首先,对数据进行分组,然后使用aggregate()

以下是您的示例数据:

x <- read.table(header = TRUE, stringsAsFactors=FALSE, text = "
                id   date       var1 var2     
                1   '7031' 2008-12-01  27  1
                2   '7031' 2009-01-05   6  0
                3   '7031' 2009-02-02   0  3
                4   '7031' 2008-11-01   1  4
                5   '7500' 2009-07-11  30  0
                6   '7500' 2009-10-01   8  0
                7   '7500' 2010-01-01   0  0
                8   '7041' 2009-06-20  26  0
                9   '7041' 2009-08-01   0  0
                10  '0277' 2009-01-01   3  0")

确保您的“日期”变量值由实际日期而非字符表示。

x$date <- as.Date(x$date)

子集:

x2 <- with(x, x[!(var1 == 0 & var2 == 0), ])

骨料:

aggregate(date ~ id, x2, max)
#     id       date
# 1  277 2009-01-01
# 2 7031 2009-02-02
# 3 7041 2009-06-20
# 4 7500 2009-10-01

如果您不想创建子集数据的新对象,还可以使用:aggregate(date ~ id, x[!(x$var1 == 0 & x$var2 == 0), ], max)