2

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

    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

任何帮助,将不胜感激!

4

1 回答 1

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)

于 2013-01-23T07:58:52.483 回答