我在以下数据集中苦苦挣扎了一段时间:
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
任何帮助将不胜感激!
答案 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)